Commit 8f033c2d authored by Igor Sheludko's avatar Igor Sheludko Committed by Commit Bot

[stubs] Cleanup ArraySingleArgumentConstructorStubs.

BUG=v8:6116

Change-Id: I9659871441f90832bc4032444fc11af86b145488
Reviewed-on: https://chromium-review.googlesource.com/458397Reviewed-by: 's avatarJakob Kummerow <jkummerow@chromium.org>
Commit-Queue: Igor Sheludko <ishell@chromium.org>
Cr-Commit-Position: refs/heads/master@{#44025}
parent 8f6135f1
...@@ -2002,39 +2002,39 @@ TF_STUB(InternalArrayNoArgumentConstructorStub, CodeStubAssembler) { ...@@ -2002,39 +2002,39 @@ TF_STUB(InternalArrayNoArgumentConstructorStub, CodeStubAssembler) {
Return(array); Return(array);
} }
namespace { class ArrayConstructorAssembler : public CodeStubAssembler {
public:
// TODO(ishell): wrap the code into SingleArgumentConstructorAssembler.
template <typename Descriptor>
void SingleArgumentConstructorCommon(CodeStubAssembler* assembler,
ElementsKind elements_kind,
compiler::Node* array_map,
compiler::Node* allocation_site,
AllocationSiteMode mode) {
typedef compiler::Node Node; typedef compiler::Node Node;
typedef CodeStubAssembler::Label Label;
Label ok(assembler); explicit ArrayConstructorAssembler(compiler::CodeAssemblerState* state)
Label smi_size(assembler); : CodeStubAssembler(state) {}
Label small_smi_size(assembler);
Label call_runtime(assembler, Label::kDeferred); void GenerateConstructor(Node* context, Node* array_function, Node* array_map,
Node* array_size, Node* allocation_site,
ElementsKind elements_kind, AllocationSiteMode mode);
};
Node* size = assembler->Parameter(Descriptor::kArraySizeSmiParameter); void ArrayConstructorAssembler::GenerateConstructor(
assembler->Branch(assembler->TaggedIsSmi(size), &smi_size, &call_runtime); Node* context, Node* array_function, Node* array_map, Node* array_size,
Node* allocation_site, ElementsKind elements_kind,
AllocationSiteMode mode) {
Label ok(this);
Label smi_size(this);
Label small_smi_size(this);
Label call_runtime(this, Label::kDeferred);
assembler->Bind(&smi_size); Branch(TaggedIsSmi(array_size), &smi_size, &call_runtime);
Bind(&smi_size);
if (IsFastPackedElementsKind(elements_kind)) { if (IsFastPackedElementsKind(elements_kind)) {
Label abort(assembler, Label::kDeferred); Label abort(this, Label::kDeferred);
assembler->Branch( Branch(SmiEqual(array_size, SmiConstant(Smi::kZero)), &small_smi_size,
assembler->SmiEqual(size, assembler->SmiConstant(Smi::kZero)), &abort);
&small_smi_size, &abort);
Bind(&abort);
assembler->Bind(&abort); Node* reason = SmiConstant(Smi::FromInt(kAllocatingNonEmptyPackedArray));
Node* reason = TailCallRuntime(Runtime::kAbort, context, reason);
assembler->SmiConstant(Smi::FromInt(kAllocatingNonEmptyPackedArray));
Node* context = assembler->Parameter(Descriptor::kContext);
assembler->TailCallRuntime(Runtime::kAbort, context, reason);
} else { } else {
int element_size = int element_size =
IsFastDoubleElementsKind(elements_kind) ? kDoubleSize : kPointerSize; IsFastDoubleElementsKind(elements_kind) ? kDoubleSize : kPointerSize;
...@@ -2042,56 +2042,53 @@ void SingleArgumentConstructorCommon(CodeStubAssembler* assembler, ...@@ -2042,56 +2042,53 @@ void SingleArgumentConstructorCommon(CodeStubAssembler* assembler,
(kMaxRegularHeapObjectSize - FixedArray::kHeaderSize - JSArray::kSize - (kMaxRegularHeapObjectSize - FixedArray::kHeaderSize - JSArray::kSize -
AllocationMemento::kSize) / AllocationMemento::kSize) /
element_size; element_size;
assembler->Branch( Branch(SmiAboveOrEqual(array_size,
assembler->SmiAboveOrEqual( SmiConstant(Smi::FromInt(max_fast_elements))),
size, assembler->SmiConstant(Smi::FromInt(max_fast_elements))), &call_runtime, &small_smi_size);
&call_runtime, &small_smi_size);
} }
assembler->Bind(&small_smi_size); Bind(&small_smi_size);
{ {
Node* array = assembler->AllocateJSArray( Node* array = AllocateJSArray(
elements_kind, array_map, size, size, elements_kind, array_map, array_size, array_size,
mode == DONT_TRACK_ALLOCATION_SITE ? nullptr : allocation_site, mode == DONT_TRACK_ALLOCATION_SITE ? nullptr : allocation_site,
CodeStubAssembler::SMI_PARAMETERS); CodeStubAssembler::SMI_PARAMETERS);
assembler->Return(array); Return(array);
} }
assembler->Bind(&call_runtime); Bind(&call_runtime);
{ {
Node* context = assembler->Parameter(Descriptor::kContext); TailCallRuntime(Runtime::kNewArray, context, array_function, array_size,
Node* function = assembler->Parameter(Descriptor::kFunction); array_function, allocation_site);
Node* array_size = assembler->Parameter(Descriptor::kArraySizeSmiParameter);
Node* allocation_site = assembler->Parameter(Descriptor::kAllocationSite);
assembler->TailCallRuntime(Runtime::kNewArray, context, function,
array_size, function, allocation_site);
} }
} }
} // namespace
TF_STUB(ArraySingleArgumentConstructorStub, CodeStubAssembler) { TF_STUB(ArraySingleArgumentConstructorStub, ArrayConstructorAssembler) {
ElementsKind elements_kind = stub->elements_kind(); ElementsKind elements_kind = stub->elements_kind();
Node* context = Parameter(Descriptor::kContext);
Node* function = Parameter(Descriptor::kFunction); Node* function = Parameter(Descriptor::kFunction);
Node* native_context = LoadObjectField(function, JSFunction::kContextOffset); Node* native_context = LoadObjectField(function, JSFunction::kContextOffset);
Node* array_map = LoadJSArrayElementsMap(elements_kind, native_context); Node* array_map = LoadJSArrayElementsMap(elements_kind, native_context);
AllocationSiteMode mode = stub->override_mode() == DISABLE_ALLOCATION_SITES AllocationSiteMode mode = stub->override_mode() == DISABLE_ALLOCATION_SITES
? DONT_TRACK_ALLOCATION_SITE ? DONT_TRACK_ALLOCATION_SITE
: AllocationSite::GetMode(elements_kind); : AllocationSite::GetMode(elements_kind);
Node* array_size = Parameter(Descriptor::kArraySizeSmiParameter);
Node* allocation_site = Parameter(Descriptor::kAllocationSite); Node* allocation_site = Parameter(Descriptor::kAllocationSite);
// TODO(ishell): pass all parameters explicitly.
SingleArgumentConstructorCommon<Descriptor>(this, elements_kind, array_map, GenerateConstructor(context, function, array_map, array_size, allocation_site,
allocation_site, mode); elements_kind, mode);
} }
TF_STUB(InternalArraySingleArgumentConstructorStub, CodeStubAssembler) { TF_STUB(InternalArraySingleArgumentConstructorStub, ArrayConstructorAssembler) {
Node* context = Parameter(Descriptor::kContext);
Node* function = Parameter(Descriptor::kFunction); Node* function = Parameter(Descriptor::kFunction);
Node* array_map = Node* array_map =
LoadObjectField(function, JSFunction::kPrototypeOrInitialMapOffset); LoadObjectField(function, JSFunction::kPrototypeOrInitialMapOffset);
Node* array_size = Parameter(Descriptor::kArraySizeSmiParameter);
Node* allocation_site = UndefinedConstant();
// TODO(ishell): pass all parameters explicitly. GenerateConstructor(context, function, array_map, array_size, allocation_site,
SingleArgumentConstructorCommon<Descriptor>(this, stub->elements_kind(), stub->elements_kind(), DONT_TRACK_ALLOCATION_SITE);
array_map, UndefinedConstant(),
DONT_TRACK_ALLOCATION_SITE);
} }
TF_STUB(GrowArrayElementsStub, CodeStubAssembler) { TF_STUB(GrowArrayElementsStub, CodeStubAssembler) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment