diff options
Diffstat (limited to 'deps/v8/src/builtins/builtins-array-gen.cc')
-rw-r--r-- | deps/v8/src/builtins/builtins-array-gen.cc | 275 |
1 files changed, 4 insertions, 271 deletions
diff --git a/deps/v8/src/builtins/builtins-array-gen.cc b/deps/v8/src/builtins/builtins-array-gen.cc index 7dfe705811..57f2f776ea 100644 --- a/deps/v8/src/builtins/builtins-array-gen.cc +++ b/deps/v8/src/builtins/builtins-array-gen.cc @@ -31,66 +31,6 @@ ArrayBuiltinsAssembler::ArrayBuiltinsAssembler( to_(this, MachineRepresentation::kTagged, SmiConstant(0)), fully_spec_compliant_(this, {&k_, &a_, &to_}) {} -void ArrayBuiltinsAssembler::FindResultGenerator() { - a_.Bind(UndefinedConstant()); -} - -Node* ArrayBuiltinsAssembler::FindProcessor(Node* k_value, Node* k) { - Node* value = CallJS(CodeFactory::Call(isolate()), context(), callbackfn(), - this_arg(), k_value, k, o()); - Label false_continue(this), return_true(this); - BranchIfToBooleanIsTrue(value, &return_true, &false_continue); - BIND(&return_true); - ReturnFromBuiltin(k_value); - BIND(&false_continue); - return a(); - } - - void ArrayBuiltinsAssembler::FindIndexResultGenerator() { - a_.Bind(SmiConstant(-1)); - } - - Node* ArrayBuiltinsAssembler::FindIndexProcessor(Node* k_value, Node* k) { - Node* value = CallJS(CodeFactory::Call(isolate()), context(), callbackfn(), - this_arg(), k_value, k, o()); - Label false_continue(this), return_true(this); - BranchIfToBooleanIsTrue(value, &return_true, &false_continue); - BIND(&return_true); - ReturnFromBuiltin(k); - BIND(&false_continue); - return a(); - } - - void ArrayBuiltinsAssembler::SomeResultGenerator() { - a_.Bind(FalseConstant()); - } - - Node* ArrayBuiltinsAssembler::SomeProcessor(Node* k_value, Node* k) { - Node* value = CallJS(CodeFactory::Call(isolate()), context(), callbackfn(), - this_arg(), k_value, k, o()); - Label false_continue(this), return_true(this); - BranchIfToBooleanIsTrue(value, &return_true, &false_continue); - BIND(&return_true); - ReturnFromBuiltin(TrueConstant()); - BIND(&false_continue); - return a(); - } - - void ArrayBuiltinsAssembler::EveryResultGenerator() { - a_.Bind(TrueConstant()); - } - - Node* ArrayBuiltinsAssembler::EveryProcessor(Node* k_value, Node* k) { - Node* value = CallJS(CodeFactory::Call(isolate()), context(), callbackfn(), - this_arg(), k_value, k, o()); - Label true_continue(this), return_false(this); - BranchIfToBooleanIsTrue(value, &true_continue, &return_false); - BIND(&return_false); - ReturnFromBuiltin(FalseConstant()); - BIND(&true_continue); - return a(); - } - void ArrayBuiltinsAssembler::TypedArrayMapResultGenerator() { // 6. Let A be ? TypedArraySpeciesCreate(O, len). TNode<JSTypedArray> original_array = CAST(o()); @@ -172,9 +112,10 @@ Node* ArrayBuiltinsAssembler::FindProcessor(Node* k_value, Node* k) { TNode<ExternalReference> memset = ExternalConstant(ExternalReference::libc_memset_function()); STATIC_ASSERT(kSizetSize == kIntptrSize); - CallCFunction3(MachineType::Pointer(), MachineType::Pointer(), - MachineType::IntPtr(), MachineType::UintPtr(), memset, - backing_store, IntPtrConstant(0), byte_length); + CallCFunction(memset, MachineType::Pointer(), + std::make_pair(MachineType::Pointer(), backing_store), + std::make_pair(MachineType::IntPtr(), IntPtrConstant(0)), + std::make_pair(MachineType::UintPtr(), byte_length)); } void ArrayBuiltinsAssembler::ReturnFromBuiltin(Node* value) { @@ -592,139 +533,6 @@ TF_BUILTIN(ArrayPrototypePush, CodeStubAssembler) { } } -TF_BUILTIN(ArrayPrototypeShift, CodeStubAssembler) { - TNode<Int32T> argc = - UncheckedCast<Int32T>(Parameter(Descriptor::kJSActualArgumentsCount)); - TNode<Context> context = CAST(Parameter(Descriptor::kContext)); - CSA_ASSERT(this, IsUndefined(Parameter(Descriptor::kJSNewTarget))); - - CodeStubArguments args(this, ChangeInt32ToIntPtr(argc)); - TNode<Object> receiver = args.GetReceiver(); - - Label runtime(this, Label::kDeferred); - Label fast(this); - - // Only shift in this stub if - // 1) the array has fast elements - // 2) the length is writable, - // 3) the elements backing store isn't copy-on-write, - // 4) we aren't supposed to shrink the backing store, - // 5) we aren't supposed to left-trim the backing store. - - // 1) Check that the array has fast elements. - BranchIfFastJSArray(receiver, context, &fast, &runtime); - - BIND(&fast); - { - TNode<JSArray> array_receiver = CAST(receiver); - CSA_ASSERT(this, TaggedIsPositiveSmi(LoadJSArrayLength(array_receiver))); - - // 2) Ensure that the length is writable. - // This check needs to happen before the check for length zero. - // The spec requires a "SetProperty(array, 'length', 0)" call when - // the length is zero. This must throw an exception in the case of a - // read-only length. - EnsureArrayLengthWritable(LoadMap(array_receiver), &runtime); - - TNode<IntPtrT> length = - LoadAndUntagObjectField(array_receiver, JSArray::kLengthOffset); - Label return_undefined(this), fast_elements_tagged(this), - fast_elements_smi(this); - GotoIf(IntPtrEqual(length, IntPtrConstant(0)), &return_undefined); - - // 3) Check that the elements backing store isn't copy-on-write. - TNode<FixedArrayBase> elements = LoadElements(array_receiver); - GotoIf(WordEqual(LoadMap(elements), LoadRoot(RootIndex::kFixedCOWArrayMap)), - &runtime); - - TNode<IntPtrT> new_length = IntPtrSub(length, IntPtrConstant(1)); - - // 4) Check that we're not supposed to right-trim the backing store, as - // implemented in elements.cc:ElementsAccessorBase::SetLengthImpl. - Node* capacity = SmiUntag(LoadFixedArrayBaseLength(elements)); - GotoIf(IntPtrLessThan( - IntPtrAdd(IntPtrAdd(new_length, new_length), - IntPtrConstant(JSObject::kMinAddedElementsCapacity)), - capacity), - &runtime); - - // 5) Check that we're not supposed to left-trim the backing store, as - // implemented in elements.cc:FastElementsAccessor::MoveElements. - GotoIf(IntPtrGreaterThan(new_length, - IntPtrConstant(JSArray::kMaxCopyElements)), - &runtime); - - StoreObjectFieldNoWriteBarrier(array_receiver, JSArray::kLengthOffset, - SmiTag(new_length)); - - TNode<IntPtrT> element_zero = IntPtrConstant(0); - TNode<IntPtrT> element_one = IntPtrConstant(1); - TNode<Int32T> elements_kind = LoadElementsKind(array_receiver); - GotoIf( - Int32LessThanOrEqual(elements_kind, Int32Constant(HOLEY_SMI_ELEMENTS)), - &fast_elements_smi); - GotoIf(Int32LessThanOrEqual(elements_kind, Int32Constant(HOLEY_ELEMENTS)), - &fast_elements_tagged); - - // Fast double elements kind: - { - CSA_ASSERT(this, - Int32LessThanOrEqual(elements_kind, - Int32Constant(HOLEY_DOUBLE_ELEMENTS))); - - VARIABLE(result, MachineRepresentation::kTagged, UndefinedConstant()); - - Label move_elements(this); - result.Bind(AllocateHeapNumberWithValue(LoadFixedDoubleArrayElement( - CAST(elements), element_zero, &move_elements))); - Goto(&move_elements); - BIND(&move_elements); - - MoveElements(HOLEY_DOUBLE_ELEMENTS, elements, element_zero, element_one, - new_length); - StoreFixedDoubleArrayHole(CAST(elements), new_length); - args.PopAndReturn(result.value()); - } - - BIND(&fast_elements_tagged); - { - TNode<FixedArray> elements_fixed_array = CAST(elements); - Node* value = LoadFixedArrayElement(elements_fixed_array, 0); - MoveElements(HOLEY_ELEMENTS, elements, element_zero, element_one, - new_length); - StoreFixedArrayElement(elements_fixed_array, new_length, - TheHoleConstant()); - GotoIf(WordEqual(value, TheHoleConstant()), &return_undefined); - args.PopAndReturn(value); - } - - BIND(&fast_elements_smi); - { - TNode<FixedArray> elements_fixed_array = CAST(elements); - Node* value = LoadFixedArrayElement(elements_fixed_array, 0); - MoveElements(HOLEY_SMI_ELEMENTS, elements, element_zero, element_one, - new_length); - StoreFixedArrayElement(elements_fixed_array, new_length, - TheHoleConstant()); - GotoIf(WordEqual(value, TheHoleConstant()), &return_undefined); - args.PopAndReturn(value); - } - - BIND(&return_undefined); - { args.PopAndReturn(UndefinedConstant()); } - } - - BIND(&runtime); - { - // We are not using Parameter(Descriptor::kJSTarget) and loading the value - // from the current frame here in order to reduce register pressure on the - // fast path. - TNode<JSFunction> target = LoadTargetFromFrame(); - TailCallBuiltin(Builtins::kArrayShift, context, target, UndefinedConstant(), - argc); - } -} - TF_BUILTIN(ExtractFastJSArray, ArrayBuiltinsAssembler) { ParameterMode mode = OptimalParameterMode(); TNode<Context> context = CAST(Parameter(Descriptor::kContext)); @@ -1047,81 +855,6 @@ TF_BUILTIN(ArrayFrom, ArrayPopulatorAssembler) { args.PopAndReturn(array.value()); } -// ES #sec-get-%typedarray%.prototype.find -TF_BUILTIN(TypedArrayPrototypeFind, ArrayBuiltinsAssembler) { - TNode<IntPtrT> argc = - ChangeInt32ToIntPtr(Parameter(Descriptor::kJSActualArgumentsCount)); - CodeStubArguments args(this, argc); - TNode<Context> context = CAST(Parameter(Descriptor::kContext)); - TNode<Object> receiver = args.GetReceiver(); - Node* callbackfn = args.GetOptionalArgumentValue(0); - Node* this_arg = args.GetOptionalArgumentValue(1); - - InitIteratingArrayBuiltinBody(context, receiver, callbackfn, this_arg, argc); - - GenerateIteratingTypedArrayBuiltinBody( - "%TypedArray%.prototype.find", - &ArrayBuiltinsAssembler::FindResultGenerator, - &ArrayBuiltinsAssembler::FindProcessor, - &ArrayBuiltinsAssembler::NullPostLoopAction); -} - -// ES #sec-get-%typedarray%.prototype.findIndex -TF_BUILTIN(TypedArrayPrototypeFindIndex, ArrayBuiltinsAssembler) { - TNode<IntPtrT> argc = - ChangeInt32ToIntPtr(Parameter(Descriptor::kJSActualArgumentsCount)); - CodeStubArguments args(this, argc); - TNode<Context> context = CAST(Parameter(Descriptor::kContext)); - TNode<Object> receiver = args.GetReceiver(); - Node* callbackfn = args.GetOptionalArgumentValue(0); - Node* this_arg = args.GetOptionalArgumentValue(1); - - InitIteratingArrayBuiltinBody(context, receiver, callbackfn, this_arg, argc); - - GenerateIteratingTypedArrayBuiltinBody( - "%TypedArray%.prototype.findIndex", - &ArrayBuiltinsAssembler::FindIndexResultGenerator, - &ArrayBuiltinsAssembler::FindIndexProcessor, - &ArrayBuiltinsAssembler::NullPostLoopAction); -} - - -TF_BUILTIN(TypedArrayPrototypeSome, ArrayBuiltinsAssembler) { - TNode<IntPtrT> argc = - ChangeInt32ToIntPtr(Parameter(Descriptor::kJSActualArgumentsCount)); - CodeStubArguments args(this, argc); - TNode<Context> context = CAST(Parameter(Descriptor::kContext)); - TNode<Object> receiver = args.GetReceiver(); - Node* callbackfn = args.GetOptionalArgumentValue(0); - Node* this_arg = args.GetOptionalArgumentValue(1); - - InitIteratingArrayBuiltinBody(context, receiver, callbackfn, this_arg, argc); - - GenerateIteratingTypedArrayBuiltinBody( - "%TypedArray%.prototype.some", - &ArrayBuiltinsAssembler::SomeResultGenerator, - &ArrayBuiltinsAssembler::SomeProcessor, - &ArrayBuiltinsAssembler::NullPostLoopAction); -} - -TF_BUILTIN(TypedArrayPrototypeEvery, ArrayBuiltinsAssembler) { - TNode<IntPtrT> argc = - ChangeInt32ToIntPtr(Parameter(Descriptor::kJSActualArgumentsCount)); - CodeStubArguments args(this, argc); - TNode<Context> context = CAST(Parameter(Descriptor::kContext)); - TNode<Object> receiver = args.GetReceiver(); - Node* callbackfn = args.GetOptionalArgumentValue(0); - Node* this_arg = args.GetOptionalArgumentValue(1); - - InitIteratingArrayBuiltinBody(context, receiver, callbackfn, this_arg, argc); - - GenerateIteratingTypedArrayBuiltinBody( - "%TypedArray%.prototype.every", - &ArrayBuiltinsAssembler::EveryResultGenerator, - &ArrayBuiltinsAssembler::EveryProcessor, - &ArrayBuiltinsAssembler::NullPostLoopAction); -} - TF_BUILTIN(TypedArrayPrototypeMap, ArrayBuiltinsAssembler) { TNode<IntPtrT> argc = ChangeInt32ToIntPtr(Parameter(Descriptor::kJSActualArgumentsCount)); |