| Index: src/builtins/builtins-arguments.cc
|
| diff --git a/src/builtins/builtins-arguments.cc b/src/builtins/builtins-arguments.cc
|
| deleted file mode 100644
|
| index 337c862a8aa9281675f3c752e13aebb3024d225a..0000000000000000000000000000000000000000
|
| --- a/src/builtins/builtins-arguments.cc
|
| +++ /dev/null
|
| @@ -1,425 +0,0 @@
|
| -// Copyright 2017 the V8 project authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "src/builtins/builtins-arguments.h"
|
| -#include "src/builtins/builtins-utils.h"
|
| -#include "src/builtins/builtins.h"
|
| -#include "src/code-factory.h"
|
| -#include "src/code-stub-assembler.h"
|
| -#include "src/interface-descriptors.h"
|
| -#include "src/objects-inl.h"
|
| -
|
| -namespace v8 {
|
| -namespace internal {
|
| -
|
| -typedef compiler::Node Node;
|
| -
|
| -std::tuple<Node*, Node*, Node*>
|
| -ArgumentsBuiltinsAssembler::GetArgumentsFrameAndCount(Node* function,
|
| - ParameterMode mode) {
|
| - CSA_ASSERT(this, HasInstanceType(function, JS_FUNCTION_TYPE));
|
| -
|
| - Variable frame_ptr(this, MachineType::PointerRepresentation());
|
| - frame_ptr.Bind(LoadParentFramePointer());
|
| - CSA_ASSERT(this,
|
| - WordEqual(function,
|
| - LoadBufferObject(frame_ptr.value(),
|
| - StandardFrameConstants::kFunctionOffset,
|
| - MachineType::Pointer())));
|
| - Variable argument_count(this, ParameterRepresentation(mode));
|
| - VariableList list({&frame_ptr, &argument_count}, zone());
|
| - Label done_argument_count(this, list);
|
| -
|
| - // Determine the number of passed parameters, which is either the count stored
|
| - // in an arguments adapter frame or fetched from the shared function info.
|
| - Node* frame_ptr_above = LoadBufferObject(
|
| - frame_ptr.value(), StandardFrameConstants::kCallerFPOffset,
|
| - MachineType::Pointer());
|
| - Node* shared =
|
| - LoadObjectField(function, JSFunction::kSharedFunctionInfoOffset);
|
| - Node* formal_parameter_count = LoadSharedFunctionInfoSpecialField(
|
| - shared, SharedFunctionInfo::kFormalParameterCountOffset, mode);
|
| - argument_count.Bind(formal_parameter_count);
|
| - Node* marker_or_function = LoadBufferObject(
|
| - frame_ptr_above, CommonFrameConstants::kContextOrFrameTypeOffset);
|
| - GotoIf(
|
| - MarkerIsNotFrameType(marker_or_function, StackFrame::ARGUMENTS_ADAPTOR),
|
| - &done_argument_count);
|
| - Node* adapted_parameter_count = LoadBufferObject(
|
| - frame_ptr_above, ArgumentsAdaptorFrameConstants::kLengthOffset);
|
| - frame_ptr.Bind(frame_ptr_above);
|
| - argument_count.Bind(TaggedToParameter(adapted_parameter_count, mode));
|
| - Goto(&done_argument_count);
|
| -
|
| - Bind(&done_argument_count);
|
| - return std::tuple<Node*, Node*, Node*>(
|
| - frame_ptr.value(), argument_count.value(), formal_parameter_count);
|
| -}
|
| -
|
| -std::tuple<Node*, Node*, Node*>
|
| -ArgumentsBuiltinsAssembler::AllocateArgumentsObject(Node* map,
|
| - Node* arguments_count,
|
| - Node* parameter_map_count,
|
| - ParameterMode mode,
|
| - int base_size) {
|
| - // Allocate the parameter object (either a Rest parameter object, a strict
|
| - // argument object or a sloppy arguments object) and the elements/mapped
|
| - // arguments together.
|
| - int elements_offset = base_size;
|
| - Node* element_count = arguments_count;
|
| - if (parameter_map_count != nullptr) {
|
| - base_size += FixedArray::kHeaderSize;
|
| - element_count = IntPtrOrSmiAdd(element_count, parameter_map_count, mode);
|
| - }
|
| - bool empty = IsIntPtrOrSmiConstantZero(arguments_count);
|
| - DCHECK_IMPLIES(empty, parameter_map_count == nullptr);
|
| - Node* size =
|
| - empty ? IntPtrConstant(base_size)
|
| - : ElementOffsetFromIndex(element_count, FAST_ELEMENTS, mode,
|
| - base_size + FixedArray::kHeaderSize);
|
| - Node* result = Allocate(size);
|
| - Comment("Initialize arguments object");
|
| - StoreMapNoWriteBarrier(result, map);
|
| - Node* empty_fixed_array = LoadRoot(Heap::kEmptyFixedArrayRootIndex);
|
| - StoreObjectField(result, JSArray::kPropertiesOffset, empty_fixed_array);
|
| - Node* smi_arguments_count = ParameterToTagged(arguments_count, mode);
|
| - StoreObjectFieldNoWriteBarrier(result, JSArray::kLengthOffset,
|
| - smi_arguments_count);
|
| - Node* arguments = nullptr;
|
| - if (!empty) {
|
| - arguments = InnerAllocate(result, elements_offset);
|
| - StoreObjectFieldNoWriteBarrier(arguments, FixedArray::kLengthOffset,
|
| - smi_arguments_count);
|
| - Node* fixed_array_map = LoadRoot(Heap::kFixedArrayMapRootIndex);
|
| - StoreMapNoWriteBarrier(arguments, fixed_array_map);
|
| - }
|
| - Node* parameter_map = nullptr;
|
| - if (parameter_map_count != nullptr) {
|
| - Node* parameter_map_offset = ElementOffsetFromIndex(
|
| - arguments_count, FAST_ELEMENTS, mode, FixedArray::kHeaderSize);
|
| - parameter_map = InnerAllocate(arguments, parameter_map_offset);
|
| - StoreObjectFieldNoWriteBarrier(result, JSArray::kElementsOffset,
|
| - parameter_map);
|
| - Node* sloppy_elements_map =
|
| - LoadRoot(Heap::kSloppyArgumentsElementsMapRootIndex);
|
| - StoreMapNoWriteBarrier(parameter_map, sloppy_elements_map);
|
| - parameter_map_count = ParameterToTagged(parameter_map_count, mode);
|
| - StoreObjectFieldNoWriteBarrier(parameter_map, FixedArray::kLengthOffset,
|
| - parameter_map_count);
|
| - } else {
|
| - if (empty) {
|
| - StoreObjectFieldNoWriteBarrier(result, JSArray::kElementsOffset,
|
| - empty_fixed_array);
|
| - } else {
|
| - StoreObjectFieldNoWriteBarrier(result, JSArray::kElementsOffset,
|
| - arguments);
|
| - }
|
| - }
|
| - return std::tuple<Node*, Node*, Node*>(result, arguments, parameter_map);
|
| -}
|
| -
|
| -Node* ArgumentsBuiltinsAssembler::ConstructParametersObjectFromArgs(
|
| - Node* map, Node* frame_ptr, Node* arg_count, Node* first_arg,
|
| - Node* rest_count, ParameterMode param_mode, int base_size) {
|
| - // Allocate the parameter object (either a Rest parameter object, a strict
|
| - // argument object or a sloppy arguments object) and the elements together and
|
| - // fill in the contents with the arguments above |formal_parameter_count|.
|
| - Node* result;
|
| - Node* elements;
|
| - Node* unused;
|
| - std::tie(result, elements, unused) =
|
| - AllocateArgumentsObject(map, rest_count, nullptr, param_mode, base_size);
|
| - DCHECK(unused == nullptr);
|
| - CodeStubArguments arguments(this, arg_count, frame_ptr, param_mode);
|
| - Variable offset(this, MachineType::PointerRepresentation());
|
| - offset.Bind(IntPtrConstant(FixedArrayBase::kHeaderSize - kHeapObjectTag));
|
| - VariableList list({&offset}, zone());
|
| - arguments.ForEach(list,
|
| - [this, elements, &offset](Node* arg) {
|
| - StoreNoWriteBarrier(MachineRepresentation::kTagged,
|
| - elements, offset.value(), arg);
|
| - Increment(offset, kPointerSize);
|
| - },
|
| - first_arg, nullptr, param_mode);
|
| - return result;
|
| -}
|
| -
|
| -Node* ArgumentsBuiltinsAssembler::EmitFastNewRestParameter(Node* context,
|
| - Node* function) {
|
| - Node* frame_ptr;
|
| - Node* argument_count;
|
| - Node* formal_parameter_count;
|
| -
|
| - ParameterMode mode = OptimalParameterMode();
|
| - Node* zero = IntPtrOrSmiConstant(0, mode);
|
| -
|
| - std::tie(frame_ptr, argument_count, formal_parameter_count) =
|
| - GetArgumentsFrameAndCount(function, mode);
|
| -
|
| - Variable result(this, MachineRepresentation::kTagged);
|
| - Label no_rest_parameters(this), runtime(this, Label::kDeferred),
|
| - done(this, &result);
|
| -
|
| - Node* rest_count =
|
| - IntPtrOrSmiSub(argument_count, formal_parameter_count, mode);
|
| - Node* const native_context = LoadNativeContext(context);
|
| - Node* const array_map = LoadJSArrayElementsMap(FAST_ELEMENTS, native_context);
|
| - GotoIf(IntPtrOrSmiLessThanOrEqual(rest_count, zero, mode),
|
| - &no_rest_parameters);
|
| -
|
| - GotoIfFixedArraySizeDoesntFitInNewSpace(
|
| - rest_count, &runtime, JSArray::kSize + FixedArray::kHeaderSize, mode);
|
| -
|
| - // Allocate the Rest JSArray and the elements together and fill in the
|
| - // contents with the arguments above |formal_parameter_count|.
|
| - result.Bind(ConstructParametersObjectFromArgs(
|
| - array_map, frame_ptr, argument_count, formal_parameter_count, rest_count,
|
| - mode, JSArray::kSize));
|
| - Goto(&done);
|
| -
|
| - Bind(&no_rest_parameters);
|
| - {
|
| - Node* arguments;
|
| - Node* elements;
|
| - Node* unused;
|
| - std::tie(arguments, elements, unused) =
|
| - AllocateArgumentsObject(array_map, zero, nullptr, mode, JSArray::kSize);
|
| - result.Bind(arguments);
|
| - Goto(&done);
|
| - }
|
| -
|
| - Bind(&runtime);
|
| - {
|
| - result.Bind(CallRuntime(Runtime::kNewRestParameter, context, function));
|
| - Goto(&done);
|
| - }
|
| -
|
| - Bind(&done);
|
| - return result.value();
|
| -}
|
| -
|
| -TF_BUILTIN(FastNewRestParameter, ArgumentsBuiltinsAssembler) {
|
| - Node* function = Parameter(FastNewArgumentsDescriptor::kFunction);
|
| - Node* context = Parameter(FastNewArgumentsDescriptor::kContext);
|
| - Return(EmitFastNewRestParameter(context, function));
|
| -}
|
| -
|
| -Node* ArgumentsBuiltinsAssembler::EmitFastNewStrictArguments(Node* context,
|
| - Node* function) {
|
| - Variable result(this, MachineRepresentation::kTagged);
|
| - Label done(this, &result), empty(this), runtime(this, Label::kDeferred);
|
| -
|
| - Node* frame_ptr;
|
| - Node* argument_count;
|
| - Node* formal_parameter_count;
|
| -
|
| - ParameterMode mode = OptimalParameterMode();
|
| - Node* zero = IntPtrOrSmiConstant(0, mode);
|
| -
|
| - std::tie(frame_ptr, argument_count, formal_parameter_count) =
|
| - GetArgumentsFrameAndCount(function, mode);
|
| -
|
| - GotoIfFixedArraySizeDoesntFitInNewSpace(
|
| - argument_count, &runtime,
|
| - JSStrictArgumentsObject::kSize + FixedArray::kHeaderSize, mode);
|
| -
|
| - Node* const native_context = LoadNativeContext(context);
|
| - Node* const map =
|
| - LoadContextElement(native_context, Context::STRICT_ARGUMENTS_MAP_INDEX);
|
| - GotoIf(WordEqual(argument_count, zero), &empty);
|
| -
|
| - result.Bind(ConstructParametersObjectFromArgs(
|
| - map, frame_ptr, argument_count, zero, argument_count, mode,
|
| - JSStrictArgumentsObject::kSize));
|
| - Goto(&done);
|
| -
|
| - Bind(&empty);
|
| - {
|
| - Node* arguments;
|
| - Node* elements;
|
| - Node* unused;
|
| - std::tie(arguments, elements, unused) = AllocateArgumentsObject(
|
| - map, zero, nullptr, mode, JSStrictArgumentsObject::kSize);
|
| - result.Bind(arguments);
|
| - Goto(&done);
|
| - }
|
| -
|
| - Bind(&runtime);
|
| - {
|
| - result.Bind(CallRuntime(Runtime::kNewStrictArguments, context, function));
|
| - Goto(&done);
|
| - }
|
| -
|
| - Bind(&done);
|
| - return result.value();
|
| -}
|
| -
|
| -TF_BUILTIN(FastNewStrictArguments, ArgumentsBuiltinsAssembler) {
|
| - Node* function = Parameter(FastNewArgumentsDescriptor::kFunction);
|
| - Node* context = Parameter(FastNewArgumentsDescriptor::kContext);
|
| - Return(EmitFastNewStrictArguments(context, function));
|
| -}
|
| -
|
| -Node* ArgumentsBuiltinsAssembler::EmitFastNewSloppyArguments(Node* context,
|
| - Node* function) {
|
| - Node* frame_ptr;
|
| - Node* argument_count;
|
| - Node* formal_parameter_count;
|
| - Variable result(this, MachineRepresentation::kTagged);
|
| -
|
| - ParameterMode mode = OptimalParameterMode();
|
| - Node* zero = IntPtrOrSmiConstant(0, mode);
|
| -
|
| - Label done(this, &result), empty(this), no_parameters(this),
|
| - runtime(this, Label::kDeferred);
|
| -
|
| - std::tie(frame_ptr, argument_count, formal_parameter_count) =
|
| - GetArgumentsFrameAndCount(function, mode);
|
| -
|
| - GotoIf(WordEqual(argument_count, zero), &empty);
|
| -
|
| - GotoIf(WordEqual(formal_parameter_count, zero), &no_parameters);
|
| -
|
| - {
|
| - Comment("Mapped parameter JSSloppyArgumentsObject");
|
| -
|
| - Node* mapped_count =
|
| - IntPtrOrSmiMin(argument_count, formal_parameter_count, mode);
|
| -
|
| - Node* parameter_map_size =
|
| - IntPtrOrSmiAdd(mapped_count, IntPtrOrSmiConstant(2, mode), mode);
|
| -
|
| - // Verify that the overall allocation will fit in new space.
|
| - Node* elements_allocated =
|
| - IntPtrOrSmiAdd(argument_count, parameter_map_size, mode);
|
| - GotoIfFixedArraySizeDoesntFitInNewSpace(
|
| - elements_allocated, &runtime,
|
| - JSSloppyArgumentsObject::kSize + FixedArray::kHeaderSize * 2, mode);
|
| -
|
| - Node* const native_context = LoadNativeContext(context);
|
| - Node* const map = LoadContextElement(
|
| - native_context, Context::FAST_ALIASED_ARGUMENTS_MAP_INDEX);
|
| - Node* argument_object;
|
| - Node* elements;
|
| - Node* map_array;
|
| - std::tie(argument_object, elements, map_array) =
|
| - AllocateArgumentsObject(map, argument_count, parameter_map_size, mode,
|
| - JSSloppyArgumentsObject::kSize);
|
| - StoreObjectFieldNoWriteBarrier(
|
| - argument_object, JSSloppyArgumentsObject::kCalleeOffset, function);
|
| - StoreFixedArrayElement(map_array, 0, context, SKIP_WRITE_BARRIER);
|
| - StoreFixedArrayElement(map_array, 1, elements, SKIP_WRITE_BARRIER);
|
| -
|
| - Comment("Fill in non-mapped parameters");
|
| - Node* argument_offset =
|
| - ElementOffsetFromIndex(argument_count, FAST_ELEMENTS, mode,
|
| - FixedArray::kHeaderSize - kHeapObjectTag);
|
| - Node* mapped_offset =
|
| - ElementOffsetFromIndex(mapped_count, FAST_ELEMENTS, mode,
|
| - FixedArray::kHeaderSize - kHeapObjectTag);
|
| - CodeStubArguments arguments(this, argument_count, frame_ptr, mode);
|
| - Variable current_argument(this, MachineType::PointerRepresentation());
|
| - current_argument.Bind(arguments.AtIndexPtr(argument_count, mode));
|
| - VariableList var_list1({¤t_argument}, zone());
|
| - mapped_offset = BuildFastLoop(
|
| - var_list1, argument_offset, mapped_offset,
|
| - [this, elements, ¤t_argument](Node* offset) {
|
| - Increment(current_argument, kPointerSize);
|
| - Node* arg = LoadBufferObject(current_argument.value(), 0);
|
| - StoreNoWriteBarrier(MachineRepresentation::kTagged, elements, offset,
|
| - arg);
|
| - },
|
| - -kPointerSize, INTPTR_PARAMETERS);
|
| -
|
| - // Copy the parameter slots and the holes in the arguments.
|
| - // We need to fill in mapped_count slots. They index the context,
|
| - // where parameters are stored in reverse order, at
|
| - // MIN_CONTEXT_SLOTS .. MIN_CONTEXT_SLOTS+argument_count-1
|
| - // The mapped parameter thus need to get indices
|
| - // MIN_CONTEXT_SLOTS+parameter_count-1 ..
|
| - // MIN_CONTEXT_SLOTS+argument_count-mapped_count
|
| - // We loop from right to left.
|
| - Comment("Fill in mapped parameters");
|
| - Variable context_index(this, OptimalParameterRepresentation());
|
| - context_index.Bind(IntPtrOrSmiSub(
|
| - IntPtrOrSmiAdd(IntPtrOrSmiConstant(Context::MIN_CONTEXT_SLOTS, mode),
|
| - formal_parameter_count, mode),
|
| - mapped_count, mode));
|
| - Node* the_hole = TheHoleConstant();
|
| - VariableList var_list2({&context_index}, zone());
|
| - const int kParameterMapHeaderSize =
|
| - FixedArray::kHeaderSize + 2 * kPointerSize;
|
| - Node* adjusted_map_array = IntPtrAdd(
|
| - BitcastTaggedToWord(map_array),
|
| - IntPtrConstant(kParameterMapHeaderSize - FixedArray::kHeaderSize));
|
| - Node* zero_offset = ElementOffsetFromIndex(
|
| - zero, FAST_ELEMENTS, mode, FixedArray::kHeaderSize - kHeapObjectTag);
|
| - BuildFastLoop(var_list2, mapped_offset, zero_offset,
|
| - [this, the_hole, elements, adjusted_map_array, &context_index,
|
| - mode](Node* offset) {
|
| - StoreNoWriteBarrier(MachineRepresentation::kTagged,
|
| - elements, offset, the_hole);
|
| - StoreNoWriteBarrier(
|
| - MachineRepresentation::kTagged, adjusted_map_array,
|
| - offset, ParameterToTagged(context_index.value(), mode));
|
| - Increment(context_index, 1, mode);
|
| - },
|
| - -kPointerSize, INTPTR_PARAMETERS);
|
| -
|
| - result.Bind(argument_object);
|
| - Goto(&done);
|
| - }
|
| -
|
| - Bind(&no_parameters);
|
| - {
|
| - Comment("No parameters JSSloppyArgumentsObject");
|
| - GotoIfFixedArraySizeDoesntFitInNewSpace(
|
| - argument_count, &runtime,
|
| - JSSloppyArgumentsObject::kSize + FixedArray::kHeaderSize, mode);
|
| - Node* const native_context = LoadNativeContext(context);
|
| - Node* const map =
|
| - LoadContextElement(native_context, Context::SLOPPY_ARGUMENTS_MAP_INDEX);
|
| - result.Bind(ConstructParametersObjectFromArgs(
|
| - map, frame_ptr, argument_count, zero, argument_count, mode,
|
| - JSSloppyArgumentsObject::kSize));
|
| - StoreObjectFieldNoWriteBarrier(
|
| - result.value(), JSSloppyArgumentsObject::kCalleeOffset, function);
|
| - Goto(&done);
|
| - }
|
| -
|
| - Bind(&empty);
|
| - {
|
| - Comment("Empty JSSloppyArgumentsObject");
|
| - Node* const native_context = LoadNativeContext(context);
|
| - Node* const map =
|
| - LoadContextElement(native_context, Context::SLOPPY_ARGUMENTS_MAP_INDEX);
|
| - Node* arguments;
|
| - Node* elements;
|
| - Node* unused;
|
| - std::tie(arguments, elements, unused) = AllocateArgumentsObject(
|
| - map, zero, nullptr, mode, JSSloppyArgumentsObject::kSize);
|
| - result.Bind(arguments);
|
| - StoreObjectFieldNoWriteBarrier(
|
| - result.value(), JSSloppyArgumentsObject::kCalleeOffset, function);
|
| - Goto(&done);
|
| - }
|
| -
|
| - Bind(&runtime);
|
| - {
|
| - result.Bind(CallRuntime(Runtime::kNewSloppyArguments, context, function));
|
| - Goto(&done);
|
| - }
|
| -
|
| - Bind(&done);
|
| - return result.value();
|
| -}
|
| -
|
| -TF_BUILTIN(FastNewSloppyArguments, ArgumentsBuiltinsAssembler) {
|
| - Node* function = Parameter(FastNewArgumentsDescriptor::kFunction);
|
| - Node* context = Parameter(FastNewArgumentsDescriptor::kContext);
|
| - Return(EmitFastNewSloppyArguments(context, function));
|
| -}
|
| -
|
| -} // namespace internal
|
| -} // namespace v8
|
|
|