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

Unified Diff: src/bootstrapper.cc

Issue 2761783002: Always run our fast array builtins. (Closed)
Patch Set: Make sure the strict map is used. 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
« no previous file with comments | « no previous file | src/flag-definitions.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/bootstrapper.cc
diff --git a/src/bootstrapper.cc b/src/bootstrapper.cc
index 2ae03256df22d6650e76ed19c565e1d822511e29..68f5507a2cd672ae2185785f58f046b04e67d12d 100644
--- a/src/bootstrapper.cc
+++ b/src/bootstrapper.cc
@@ -218,7 +218,7 @@ class Genesis BASE_EMBEDDED {
void InstallOneBuiltinFunction(const char* object, const char* method,
Builtins::Name name);
- void InitializeGlobal_enable_fast_array_builtins();
+ void InitializeGlobal_experimental_fast_array_builtins();
Handle<JSFunction> InstallArrayBuffer(Handle<JSObject> target,
const char* name, Builtins::Name call,
@@ -433,6 +433,24 @@ Handle<JSFunction> SimpleCreateFunction(Isolate* isolate, Handle<String> name,
return fun;
}
+Handle<JSFunction> InstallArrayBuiltinFunction(Handle<JSObject> base,
+ const char* name,
+ Builtins::Name call,
+ int argument_count) {
+ Isolate* isolate = base->GetIsolate();
+ Handle<String> str_name = isolate->factory()->InternalizeUtf8String(name);
+ Handle<JSFunction> fun =
+ CreateFunction(isolate, str_name, JS_OBJECT_TYPE, JSObject::kHeaderSize,
+ MaybeHandle<JSObject>(), call, true);
+ fun->shared()->set_internal_formal_parameter_count(argument_count);
+
+ // Set the length to 1 to satisfy ECMA-262.
+ fun->shared()->set_length(1);
+ fun->shared()->set_language_mode(STRICT);
+ InstallFunction(base, fun, str_name);
+ return fun;
+}
+
Handle<JSFunction> SimpleInstallFunction(Handle<JSObject> base,
Handle<String> name,
Builtins::Name call, int len,
@@ -3066,10 +3084,9 @@ void Genesis::InitializeExperimentalGlobal() {
HARMONY_SHIPPING(FEATURE_INITIALIZE_GLOBAL)
#undef FEATURE_INITIALIZE_GLOBAL
- InitializeGlobal_enable_fast_array_builtins();
+ InitializeGlobal_experimental_fast_array_builtins();
}
-
bool Bootstrapper::CompileBuiltin(Isolate* isolate, int index) {
Vector<const char> name = Natives::GetScriptName(index);
Handle<String> source_code =
@@ -3689,17 +3706,11 @@ void Genesis::InstallOneBuiltinFunction(const char* object_name,
isolate->builtins()->builtin(builtin_name));
}
-void Genesis::InitializeGlobal_enable_fast_array_builtins() {
- if (!FLAG_enable_fast_array_builtins) return;
+void Genesis::InitializeGlobal_experimental_fast_array_builtins() {
+ if (!FLAG_experimental_fast_array_builtins) return;
- InstallOneBuiltinFunction("Array", "forEach", Builtins::kArrayForEach);
- InstallOneBuiltinFunction("Array", "every", Builtins::kArrayEvery);
- InstallOneBuiltinFunction("Array", "some", Builtins::kArraySome);
- InstallOneBuiltinFunction("Array", "reduce", Builtins::kArrayReduce);
-
- if (FLAG_experimental_array_builtins) {
- InstallOneBuiltinFunction("Array", "filter", Builtins::kArrayFilter);
- }
+ // Insert experimental fast array builtins here.
+ InstallOneBuiltinFunction("Array", "filter", Builtins::kArrayFilter);
}
void Genesis::InitializeGlobal_harmony_sharedarraybuffer() {
@@ -4143,10 +4154,21 @@ bool Genesis::InstallNatives(GlobalContextType context_type) {
SimpleInstallFunction(global_object, "isNaN", Builtins::kGlobalIsNaN, 1, true,
kGlobalIsNaN);
- // Install Array.prototype.concat
+ // Install Array builtin functions.
{
Handle<JSFunction> array_constructor(native_context()->array_function());
- Handle<JSObject> proto(JSObject::cast(array_constructor->prototype()));
+ Handle<JSArray> proto(JSArray::cast(array_constructor->prototype()));
+
+ // Verification of important array prototype properties.
+ Object* length = proto->length();
+ CHECK(length->IsSmi());
+ CHECK(Smi::cast(length)->value() == 0);
+ CHECK(proto->HasFastSmiOrObjectElements());
+ // This is necessary to enable fast checks for absence of elements
+ // on Array.prototype and below.
+ proto->set_elements(heap()->empty_fixed_array());
+
+ // Install Array.prototype.concat
Handle<JSFunction> concat =
InstallFunction(proto, "concat", JS_OBJECT_TYPE, JSObject::kHeaderSize,
MaybeHandle<JSObject>(), Builtins::kArrayConcat);
@@ -4158,6 +4180,21 @@ bool Genesis::InstallNatives(GlobalContextType context_type) {
DCHECK(concat->is_compiled());
// Set the lengths for the functions to satisfy ECMA-262.
concat->shared()->set_length(1);
+
+ // Install Array.prototype.forEach
+ Handle<JSFunction> forEach = InstallArrayBuiltinFunction(
+ proto, "forEach", Builtins::kArrayForEach, 2);
+ // Add forEach to the context.
+ native_context()->set_array_for_each_iterator(*forEach);
+
+ // Install Array.prototype.every
+ InstallArrayBuiltinFunction(proto, "every", Builtins::kArrayEvery, 2);
+
+ // Install Array.prototype.some
+ InstallArrayBuiltinFunction(proto, "some", Builtins::kArraySome, 2);
+
+ // Install Array.prototype.reduce
+ InstallArrayBuiltinFunction(proto, "reduce", Builtins::kArrayReduce, 2);
}
// Install InternalArray.prototype.concat
« no previous file with comments | « no previous file | src/flag-definitions.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698