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); |