Index: src/builtins/builtins-array-gen.cc |
diff --git a/src/builtins/builtins-array-gen.cc b/src/builtins/builtins-array-gen.cc |
index 21269fdc65bae7854fa2604358c63ee423207902..c75f35821d40895ea2e6a8382e91b20f45551a15 100644 |
--- a/src/builtins/builtins-array-gen.cc |
+++ b/src/builtins/builtins-array-gen.cc |
@@ -46,7 +46,7 @@ class ArrayBuiltinCodeStubAssembler : public CodeStubAssembler { |
Label false_continue(this), return_true(this); |
BranchIfToBooleanIsTrue(value, &return_true, &false_continue); |
BIND(&return_true); |
- Return(TrueConstant()); |
+ ReturnFromBuiltin(TrueConstant()); |
BIND(&false_continue); |
return a(); |
} |
@@ -59,44 +59,12 @@ class ArrayBuiltinCodeStubAssembler : public CodeStubAssembler { |
Label true_continue(this), return_false(this); |
BranchIfToBooleanIsTrue(value, &true_continue, &return_false); |
BIND(&return_false); |
- Return(FalseConstant()); |
+ ReturnFromBuiltin(FalseConstant()); |
BIND(&true_continue); |
return a(); |
} |
- Node* ReduceResultGenerator() { |
- VARIABLE(a, MachineRepresentation::kTagged, UndefinedConstant()); |
- Label no_initial_value(this), has_initial_value(this), done(this, {&a}); |
- |
- // 8. If initialValue is present, then |
- Node* parent_frame_ptr = LoadParentFramePointer(); |
- Node* marker_or_function = LoadBufferObject( |
- parent_frame_ptr, CommonFrameConstants::kContextOrFrameTypeOffset); |
- GotoIf( |
- MarkerIsNotFrameType(marker_or_function, StackFrame::ARGUMENTS_ADAPTOR), |
- &has_initial_value); |
- |
- // Has arguments adapter, check count. |
- Node* adapted_parameter_count = LoadBufferObject( |
- parent_frame_ptr, ArgumentsAdaptorFrameConstants::kLengthOffset); |
- Branch(SmiLessThan(adapted_parameter_count, |
- SmiConstant(IteratingArrayBuiltinDescriptor::kThisArg)), |
- &no_initial_value, &has_initial_value); |
- |
- // a. Set accumulator to initialValue. |
- BIND(&has_initial_value); |
- a.Bind(this_arg()); |
- Goto(&done); |
- |
- // 9. Else initialValue is not present, |
- BIND(&no_initial_value); |
- |
- // a. Let kPresent be false. |
- a.Bind(TheHoleConstant()); |
- Goto(&done); |
- BIND(&done); |
- return a.value(); |
- } |
+ Node* ReduceResultGenerator() { return this_arg(); } |
Node* ReduceProcessor(Node* k_value, Node* k) { |
VARIABLE(result, MachineRepresentation::kTagged); |
@@ -266,6 +234,7 @@ class ArrayBuiltinCodeStubAssembler : public CodeStubAssembler { |
Node* context() { return context_; } |
Node* receiver() { return receiver_; } |
Node* new_target() { return new_target_; } |
+ Node* argc() { return argc_; } |
Node* o() { return o_; } |
Node* len() { return len_; } |
Node* callbackfn() { return callbackfn_; } |
@@ -273,14 +242,23 @@ class ArrayBuiltinCodeStubAssembler : public CodeStubAssembler { |
Node* k() { return k_.value(); } |
Node* a() { return a_.value(); } |
+ void ReturnFromBuiltin(Node* value) { |
+ if (argc_ == nullptr) { |
+ Return(value); |
+ } else { |
+ PopAndReturn(IntPtrAdd(argc_, IntPtrConstant(1)), value); |
Igor Sheludko
2017/04/27 10:38:05
It would be nice to have a comment that +1 is here
danno
2017/04/28 06:58:10
Done.
|
+ } |
+ } |
+ |
void InitIteratingArrayBuiltinBody(Node* context, Node* receiver, |
Node* callbackfn, Node* this_arg, |
- Node* new_target) { |
+ Node* new_target, Node* argc) { |
context_ = context; |
receiver_ = receiver; |
new_target_ = new_target; |
callbackfn_ = callbackfn; |
this_arg_ = this_arg; |
+ argc_ = argc; |
} |
void GenerateIteratingArrayBuiltinBody( |
@@ -362,13 +340,10 @@ class ArrayBuiltinCodeStubAssembler : public CodeStubAssembler { |
BIND(&slow); |
- Node* target = LoadFromFrame(StandardFrameConstants::kFunctionOffset, |
- MachineType::TaggedPointer()); |
- TailCallStub( |
- slow_case_continuation, context(), target, new_target(), |
- Int32Constant(IteratingArrayBuiltinLoopContinuationDescriptor::kArity), |
- receiver(), callbackfn(), this_arg(), a_.value(), o(), k_.value(), |
- len(), to_.value()); |
+ Node* result = |
+ CallStub(slow_case_continuation, context(), receiver(), callbackfn(), |
+ this_arg(), a_.value(), o(), k_.value(), len(), to_.value()); |
+ ReturnFromBuiltin(result); |
} |
void InitIteratingArrayBuiltinLoopContinuation(Node* context, Node* receiver, |
@@ -379,6 +354,7 @@ class ArrayBuiltinCodeStubAssembler : public CodeStubAssembler { |
context_ = context; |
this_arg_ = this_arg; |
callbackfn_ = callbackfn; |
+ argc_ = nullptr; |
a_.Bind(a); |
k_.Bind(initial_k); |
o_ = o; |
@@ -682,7 +658,7 @@ class ArrayBuiltinCodeStubAssembler : public CodeStubAssembler { |
action(this); |
// No exception, return success |
- Return(a_.value()); |
+ ReturnFromBuiltin(a_.value()); |
} |
BIND(&maybe_double_elements); |
@@ -697,7 +673,7 @@ class ArrayBuiltinCodeStubAssembler : public CodeStubAssembler { |
action(this); |
// No exception, return success |
- Return(a_.value()); |
+ ReturnFromBuiltin(a_.value()); |
} |
} |
@@ -708,6 +684,7 @@ class ArrayBuiltinCodeStubAssembler : public CodeStubAssembler { |
Node* context_ = nullptr; |
Node* receiver_ = nullptr; |
Node* new_target_ = nullptr; |
+ Node* argc_ = nullptr; |
Variable k_; |
Variable a_; |
Variable to_; |
@@ -863,14 +840,17 @@ TF_BUILTIN(ArrayForEachLoopContinuation, ArrayBuiltinCodeStubAssembler) { |
} |
TF_BUILTIN(ArrayForEach, ArrayBuiltinCodeStubAssembler) { |
- Node* context = Parameter(Descriptor::kContext); |
- Node* receiver = Parameter(Descriptor::kReceiver); |
- Node* callbackfn = Parameter(Descriptor::kCallbackFn); |
- Node* this_arg = Parameter(Descriptor::kThisArg); |
- Node* new_target = Parameter(Descriptor::kNewTarget); |
+ Node* argc = |
+ ChangeInt32ToIntPtr(Parameter(BuiltinDescriptor::kArgumentsCount)); |
+ CodeStubArguments args(this, argc); |
+ Node* context = Parameter(BuiltinDescriptor::kContext); |
+ Node* new_target = Parameter(BuiltinDescriptor::kNewTarget); |
+ Node* receiver = args.GetReceiver(); |
+ Node* callbackfn = args.GetOptionalArgumentValue(0, UndefinedConstant()); |
+ Node* this_arg = args.GetOptionalArgumentValue(1, UndefinedConstant()); |
InitIteratingArrayBuiltinBody(context, receiver, callbackfn, this_arg, |
- new_target); |
+ new_target, argc); |
GenerateIteratingArrayBuiltinBody( |
"Array.prototype.forEach", |
@@ -901,14 +881,17 @@ TF_BUILTIN(ArraySomeLoopContinuation, ArrayBuiltinCodeStubAssembler) { |
} |
TF_BUILTIN(ArraySome, ArrayBuiltinCodeStubAssembler) { |
- Node* context = Parameter(Descriptor::kContext); |
- Node* receiver = Parameter(Descriptor::kReceiver); |
- Node* callbackfn = Parameter(Descriptor::kCallbackFn); |
- Node* this_arg = Parameter(Descriptor::kThisArg); |
- Node* new_target = Parameter(Descriptor::kNewTarget); |
+ Node* argc = |
+ ChangeInt32ToIntPtr(Parameter(BuiltinDescriptor::kArgumentsCount)); |
+ CodeStubArguments args(this, argc); |
+ Node* context = Parameter(BuiltinDescriptor::kContext); |
+ Node* new_target = Parameter(BuiltinDescriptor::kNewTarget); |
+ Node* receiver = args.GetReceiver(); |
+ Node* callbackfn = args.GetOptionalArgumentValue(0, UndefinedConstant()); |
+ Node* this_arg = args.GetOptionalArgumentValue(1, UndefinedConstant()); |
InitIteratingArrayBuiltinBody(context, receiver, callbackfn, this_arg, |
- new_target); |
+ new_target, argc); |
GenerateIteratingArrayBuiltinBody( |
"Array.prototype.some", |
@@ -926,7 +909,7 @@ TF_BUILTIN(TypedArrayPrototypeSome, ArrayBuiltinCodeStubAssembler) { |
Node* new_target = Parameter(Descriptor::kNewTarget); |
InitIteratingArrayBuiltinBody(context, receiver, callbackfn, this_arg, |
- new_target); |
+ new_target, nullptr); |
GenerateIteratingTypedArrayBuiltinBody( |
"%TypedArray%.prototype.some", |
@@ -956,14 +939,17 @@ TF_BUILTIN(ArrayEveryLoopContinuation, ArrayBuiltinCodeStubAssembler) { |
} |
TF_BUILTIN(ArrayEvery, ArrayBuiltinCodeStubAssembler) { |
- Node* context = Parameter(Descriptor::kContext); |
- Node* receiver = Parameter(Descriptor::kReceiver); |
- Node* callbackfn = Parameter(Descriptor::kCallbackFn); |
- Node* this_arg = Parameter(Descriptor::kThisArg); |
- Node* new_target = Parameter(Descriptor::kNewTarget); |
+ Node* argc = |
+ ChangeInt32ToIntPtr(Parameter(BuiltinDescriptor::kArgumentsCount)); |
+ CodeStubArguments args(this, argc); |
+ Node* context = Parameter(BuiltinDescriptor::kContext); |
+ Node* new_target = Parameter(BuiltinDescriptor::kNewTarget); |
+ Node* receiver = args.GetReceiver(); |
+ Node* callbackfn = args.GetOptionalArgumentValue(0, UndefinedConstant()); |
+ Node* this_arg = args.GetOptionalArgumentValue(1, UndefinedConstant()); |
InitIteratingArrayBuiltinBody(context, receiver, callbackfn, this_arg, |
- new_target); |
+ new_target, argc); |
GenerateIteratingArrayBuiltinBody( |
"Array.prototype.every", |
@@ -981,7 +967,7 @@ TF_BUILTIN(TypedArrayPrototypeEvery, ArrayBuiltinCodeStubAssembler) { |
Node* new_target = Parameter(Descriptor::kNewTarget); |
InitIteratingArrayBuiltinBody(context, receiver, callbackfn, this_arg, |
- new_target); |
+ new_target, nullptr); |
GenerateIteratingTypedArrayBuiltinBody( |
"%TypedArray%.prototype.every", |
@@ -1011,14 +997,17 @@ TF_BUILTIN(ArrayReduceLoopContinuation, ArrayBuiltinCodeStubAssembler) { |
} |
TF_BUILTIN(ArrayReduce, ArrayBuiltinCodeStubAssembler) { |
- Node* context = Parameter(Descriptor::kContext); |
- Node* receiver = Parameter(Descriptor::kReceiver); |
- Node* callbackfn = Parameter(Descriptor::kCallbackFn); |
- Node* initial_value = Parameter(Descriptor::kInitialValue); |
- Node* new_target = Parameter(Descriptor::kNewTarget); |
+ Node* argc = |
+ ChangeInt32ToIntPtr(Parameter(BuiltinDescriptor::kArgumentsCount)); |
+ CodeStubArguments args(this, argc); |
+ Node* context = Parameter(BuiltinDescriptor::kContext); |
+ Node* new_target = Parameter(BuiltinDescriptor::kNewTarget); |
+ Node* receiver = args.GetReceiver(); |
+ Node* callbackfn = args.GetOptionalArgumentValue(0, UndefinedConstant()); |
+ Node* initial_value = args.GetOptionalArgumentValue(1, TheHoleConstant()); |
InitIteratingArrayBuiltinBody(context, receiver, callbackfn, initial_value, |
- new_target); |
+ new_target, argc); |
GenerateIteratingArrayBuiltinBody( |
"Array.prototype.reduce", |
@@ -1036,7 +1025,7 @@ TF_BUILTIN(TypedArrayPrototypeReduce, ArrayBuiltinCodeStubAssembler) { |
Node* new_target = Parameter(Descriptor::kNewTarget); |
InitIteratingArrayBuiltinBody(context, receiver, callbackfn, initial_value, |
- new_target); |
+ new_target, nullptr); |
GenerateIteratingTypedArrayBuiltinBody( |
"%TypedArray%.prototype.reduce", |
@@ -1067,14 +1056,17 @@ TF_BUILTIN(ArrayReduceRightLoopContinuation, ArrayBuiltinCodeStubAssembler) { |
} |
TF_BUILTIN(ArrayReduceRight, ArrayBuiltinCodeStubAssembler) { |
- Node* context = Parameter(Descriptor::kContext); |
- Node* receiver = Parameter(Descriptor::kReceiver); |
- Node* callbackfn = Parameter(Descriptor::kCallbackFn); |
- Node* initial_value = Parameter(Descriptor::kInitialValue); |
- Node* new_target = Parameter(Descriptor::kNewTarget); |
+ Node* argc = |
+ ChangeInt32ToIntPtr(Parameter(BuiltinDescriptor::kArgumentsCount)); |
+ CodeStubArguments args(this, argc); |
+ Node* context = Parameter(BuiltinDescriptor::kContext); |
+ Node* new_target = Parameter(BuiltinDescriptor::kNewTarget); |
+ Node* receiver = args.GetReceiver(); |
+ Node* callbackfn = args.GetOptionalArgumentValue(0, UndefinedConstant()); |
+ Node* initial_value = args.GetOptionalArgumentValue(1, TheHoleConstant()); |
InitIteratingArrayBuiltinBody(context, receiver, callbackfn, initial_value, |
- new_target); |
+ new_target, argc); |
GenerateIteratingArrayBuiltinBody( |
"Array.prototype.reduceRight", |
@@ -1093,7 +1085,7 @@ TF_BUILTIN(TypedArrayPrototypeReduceRight, ArrayBuiltinCodeStubAssembler) { |
Node* new_target = Parameter(Descriptor::kNewTarget); |
InitIteratingArrayBuiltinBody(context, receiver, callbackfn, initial_value, |
- new_target); |
+ new_target, nullptr); |
GenerateIteratingTypedArrayBuiltinBody( |
"%TypedArray%.prototype.reduceRight", |
@@ -1124,14 +1116,17 @@ TF_BUILTIN(ArrayFilterLoopContinuation, ArrayBuiltinCodeStubAssembler) { |
} |
TF_BUILTIN(ArrayFilter, ArrayBuiltinCodeStubAssembler) { |
- Node* context = Parameter(Descriptor::kContext); |
- Node* receiver = Parameter(Descriptor::kReceiver); |
- Node* callbackfn = Parameter(Descriptor::kCallbackFn); |
- Node* this_arg = Parameter(Descriptor::kThisArg); |
- Node* new_target = Parameter(Descriptor::kNewTarget); |
+ Node* argc = |
+ ChangeInt32ToIntPtr(Parameter(BuiltinDescriptor::kArgumentsCount)); |
+ CodeStubArguments args(this, argc); |
+ Node* context = Parameter(BuiltinDescriptor::kContext); |
+ Node* new_target = Parameter(BuiltinDescriptor::kNewTarget); |
+ Node* receiver = args.GetReceiver(); |
+ Node* callbackfn = args.GetOptionalArgumentValue(0, UndefinedConstant()); |
+ Node* this_arg = args.GetOptionalArgumentValue(1, UndefinedConstant()); |
InitIteratingArrayBuiltinBody(context, receiver, callbackfn, this_arg, |
- new_target); |
+ new_target, argc); |
GenerateIteratingArrayBuiltinBody( |
"Array.prototype.filter", |
@@ -1162,14 +1157,17 @@ TF_BUILTIN(ArrayMapLoopContinuation, ArrayBuiltinCodeStubAssembler) { |
} |
TF_BUILTIN(ArrayMap, ArrayBuiltinCodeStubAssembler) { |
- Node* context = Parameter(Descriptor::kContext); |
- Node* receiver = Parameter(Descriptor::kReceiver); |
- Node* callbackfn = Parameter(Descriptor::kCallbackFn); |
- Node* this_arg = Parameter(Descriptor::kThisArg); |
- Node* new_target = Parameter(Descriptor::kNewTarget); |
+ Node* argc = |
+ ChangeInt32ToIntPtr(Parameter(BuiltinDescriptor::kArgumentsCount)); |
+ CodeStubArguments args(this, argc); |
+ Node* context = Parameter(BuiltinDescriptor::kContext); |
+ Node* new_target = Parameter(BuiltinDescriptor::kNewTarget); |
+ Node* receiver = args.GetReceiver(); |
+ Node* callbackfn = args.GetOptionalArgumentValue(0, UndefinedConstant()); |
+ Node* this_arg = args.GetOptionalArgumentValue(1, UndefinedConstant()); |
InitIteratingArrayBuiltinBody(context, receiver, callbackfn, this_arg, |
- new_target); |
+ new_target, argc); |
GenerateIteratingArrayBuiltinBody( |
"Array.prototype.map", &ArrayBuiltinCodeStubAssembler::MapResultGenerator, |