Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(535)

Unified Diff: src/builtins/builtins-array-gen.cc

Issue 2765293002: [Builtins] Provide a code-stub impl. of Array.prototype.map (Closed)
Patch Set: Bugfix. Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);
« no previous file with comments | « src/builtins/builtins.h ('k') | src/code-factory.h » ('j') | src/flag-definitions.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698