Chromium Code Reviews| Index: src/builtins/builtins-array-gen.cc |
| diff --git a/src/builtins/builtins-array-gen.cc b/src/builtins/builtins-array-gen.cc |
| index 41a75c49b0b660e7be0aa1be8ef9ba9cfc7d0c85..0027d91866e337bfa8ed2e311ed2365ab4532310 100644 |
| --- a/src/builtins/builtins-array-gen.cc |
| +++ b/src/builtins/builtins-array-gen.cc |
| @@ -128,6 +128,11 @@ class ArrayBuiltinCodeStubAssembler : public CodeStubAssembler { |
| return ArraySpeciesCreate(context(), o(), SmiConstant(0)); |
| } |
| + Node* MapResultGenerator() { |
| + // 7. Let A be ArraySpeciesCreate(O, 0). |
| + return ArraySpeciesCreate(context(), o(), len_); |
| + } |
| + |
|
danno
2017/03/23 12:25:04
Nit: Elsewhere we group the *Generator/*Filters to
mvstanton
2017/03/24 09:37:08
Done.
|
| Node* FilterProcessor(Node* k_value, Node* k) { |
| Node* callback_result = CallJS(CodeFactory::Call(isolate()), context(), |
| callbackfn(), this_arg(), k_value, k, o()); |
| @@ -147,6 +152,17 @@ class ArrayBuiltinCodeStubAssembler : public CodeStubAssembler { |
| return a(); |
| } |
| + Node* MapProcessor(Node* k_value, Node* k) { |
| + Node* callback_result = CallJS(CodeFactory::Call(isolate()), context(), |
| + callbackfn(), this_arg(), k_value, k, o()); |
| + // TODO(mvstanton): in some cases we have the ToString version of k, |
| + // in the continuation. |
| + Node* const p_k = ToString(context(), k); |
|
danno
2017/03/23 12:25:04
I wonder if you really need the ToString here, bec
mvstanton
2017/03/24 09:37:08
Done. This prompted some comment cleanup, to annot
|
| + CallRuntime(Runtime::kCreateDataProperty, context(), a(), p_k, |
| + callback_result); |
| + return a(); |
| + } |
| + |
| void NullPostLoopAction() {} |
| protected: |
| @@ -770,13 +786,50 @@ TF_BUILTIN(ArrayFilter, ArrayBuiltinCodeStubAssembler) { |
| new_target); |
| GenerateIteratingArrayBuiltinBody( |
| - "Array.prototype.reduce", |
| + "Array.prototype.filter", |
| &ArrayBuiltinCodeStubAssembler::FilterResultGenerator, |
| &ArrayBuiltinCodeStubAssembler::FilterProcessor, |
| &ArrayBuiltinCodeStubAssembler::NullPostLoopAction, |
| CodeFactory::ArrayFilterLoopContinuation(isolate())); |
| } |
| +TF_BUILTIN(ArrayMapLoopContinuation, ArrayBuiltinCodeStubAssembler) { |
| + Node* context = Parameter(Descriptor::kContext); |
| + Node* receiver = Parameter(Descriptor::kReceiver); |
| + Node* callbackfn = Parameter(Descriptor::kCallbackFn); |
| + Node* this_arg = Parameter(Descriptor::kThisArg); |
| + Node* array = Parameter(Descriptor::kArray); |
| + Node* object = Parameter(Descriptor::kObject); |
| + Node* initial_k = Parameter(Descriptor::kInitialK); |
| + Node* len = Parameter(Descriptor::kLength); |
| + Node* to = Parameter(Descriptor::kTo); |
| + |
| + InitIteratingArrayBuiltinLoopContinuation(context, receiver, callbackfn, |
| + this_arg, array, object, initial_k, |
| + len, to); |
| + |
| + GenerateIteratingArrayBuiltinLoopContinuation( |
| + &ArrayBuiltinCodeStubAssembler::MapProcessor, |
| + &ArrayBuiltinCodeStubAssembler::NullPostLoopAction); |
| +} |
| + |
| +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); |
| + |
| + InitIteratingArrayBuiltinBody(context, receiver, callbackfn, this_arg, |
| + new_target); |
| + |
| + GenerateIteratingArrayBuiltinBody( |
| + "Array.prototype.map", &ArrayBuiltinCodeStubAssembler::MapResultGenerator, |
| + &ArrayBuiltinCodeStubAssembler::MapProcessor, |
| + &ArrayBuiltinCodeStubAssembler::NullPostLoopAction, |
| + CodeFactory::ArrayMapLoopContinuation(isolate())); |
| +} |
| + |
| TF_BUILTIN(ArrayIsArray, CodeStubAssembler) { |
| Node* object = Parameter(Descriptor::kArg); |
| Node* context = Parameter(Descriptor::kContext); |