Commit 1e854443 authored by Peter Marshall's avatar Peter Marshall Committed by Commit Bot

[cleanup] Add a helper explicitly for BuiltinId functions in bootstrapper

- Remove the InstallFunction variant which just passed its arguments
  straight to JSObject::AddProperty
- Change InstallFunction to accept a String rather than a Symbol as all
  symbol installation goes through InstallFunctionAtSymbol now. This way
  we can avoid the call to Name::ToFunctionName as well
- Add an explicit helper InstallFunctionWithBuiltinId for installing
  functions which have a builtin ID. These are always installed with
  DONT_ENUM PropertyAttributes so we can remove that parameter, too.
- Remove PropertyAttributes from InstallFunction because it is always
  DONT_ENUM.

Bug: v8:8238
Change-Id: I7af3d6d833d50065c20e198e21a72ef4a539c1ca
Reviewed-on: https://chromium-review.googlesource.com/c/1349284Reviewed-by: 's avatarMarja Hölttä <marja@chromium.org>
Commit-Queue: Peter Marshall <petermarshall@chromium.org>
Cr-Commit-Position: refs/heads/master@{#57789}
parent 26b145ab
......@@ -401,13 +401,6 @@ V8_NOINLINE Handle<SharedFunctionInfo> SimpleCreateBuiltinSharedFunctionInfo(
return shared;
}
V8_NOINLINE void InstallFunction(Isolate* isolate, Handle<JSObject> target,
Handle<Name> property_name,
Handle<JSFunction> function,
PropertyAttributes attributes = DONT_ENUM) {
JSObject::AddProperty(isolate, target, property_name, function, attributes);
}
V8_NOINLINE Handle<JSFunction> CreateFunction(
Isolate* isolate, Handle<String> name, InstanceType type, int instance_size,
int inobject_properties, Handle<Object> prototype,
......@@ -430,16 +423,12 @@ V8_NOINLINE Handle<JSFunction> CreateFunction(
}
V8_NOINLINE Handle<JSFunction> InstallFunction(
Isolate* isolate, Handle<JSObject> target, Handle<Name> name,
Isolate* isolate, Handle<JSObject> target, Handle<String> name,
InstanceType type, int instance_size, int inobject_properties,
Handle<Object> prototype, Builtins::Name call,
PropertyAttributes attributes) {
Handle<String> name_string =
Name::ToFunctionName(isolate, name).ToHandleChecked();
Handle<JSFunction> function =
CreateFunction(isolate, name_string, type, instance_size,
inobject_properties, prototype, call);
InstallFunction(isolate, target, name, function, attributes);
Handle<Object> prototype, Builtins::Name call) {
Handle<JSFunction> function = CreateFunction(
isolate, name, type, instance_size, inobject_properties, prototype, call);
JSObject::AddProperty(isolate, target, name, function, DONT_ENUM);
return function;
}
......@@ -447,10 +436,9 @@ V8_NOINLINE Handle<JSFunction> InstallFunction(
Isolate* isolate, Handle<JSObject> target, const char* name,
InstanceType type, int instance_size, int inobject_properties,
Handle<Object> prototype, Builtins::Name call) {
PropertyAttributes attributes = DONT_ENUM;
return InstallFunction(
isolate, target, isolate->factory()->InternalizeUtf8String(name), type,
instance_size, inobject_properties, prototype, call, attributes);
return InstallFunction(isolate, target,
isolate->factory()->InternalizeUtf8String(name), type,
instance_size, inobject_properties, prototype, call);
}
V8_NOINLINE Handle<JSFunction> SimpleCreateFunction(Isolate* isolate,
......@@ -473,49 +461,47 @@ V8_NOINLINE Handle<JSFunction> SimpleCreateFunction(Isolate* isolate,
return fun;
}
V8_NOINLINE Handle<JSFunction> SimpleInstallFunction(
Isolate* isolate, Handle<JSObject> base, Handle<Name> property_name,
Handle<String> function_name, Builtins::Name call, int len, bool adapt,
PropertyAttributes attrs = DONT_ENUM,
BuiltinFunctionId id = BuiltinFunctionId::kInvalidBuiltinFunctionId) {
V8_NOINLINE Handle<JSFunction> InstallFunctionWithBuiltinId(
Isolate* isolate, Handle<JSObject> base, const char* name,
Builtins::Name call, int len, bool adapt, BuiltinFunctionId id) {
DCHECK_NE(BuiltinFunctionId::kInvalidBuiltinFunctionId, id);
Handle<String> internalized_name =
isolate->factory()->InternalizeUtf8String(name);
Handle<JSFunction> fun =
SimpleCreateFunction(isolate, function_name, call, len, adapt);
if (id != BuiltinFunctionId::kInvalidBuiltinFunctionId) {
SimpleCreateFunction(isolate, internalized_name, call, len, adapt);
fun->shared()->set_builtin_function_id(id);
}
InstallFunction(isolate, base, property_name, fun, attrs);
JSObject::AddProperty(isolate, base, internalized_name, fun, DONT_ENUM);
return fun;
}
V8_NOINLINE Handle<JSFunction> InstallFunctionAtSymbol(
Isolate* isolate, Handle<JSObject> base, Handle<Symbol> symbol,
const char* symbol_string, Builtins::Name call, int len, bool adapt,
PropertyAttributes attrs = DONT_ENUM,
BuiltinFunctionId id = BuiltinFunctionId::kInvalidBuiltinFunctionId) {
return SimpleInstallFunction(
isolate, base, symbol,
isolate->factory()->InternalizeUtf8String(symbol_string), call, len,
adapt, attrs, id);
}
V8_NOINLINE Handle<JSFunction> SimpleInstallFunction(
Isolate* isolate, Handle<JSObject> base, const char* name,
Builtins::Name call, int len, bool adapt,
PropertyAttributes attrs = DONT_ENUM,
BuiltinFunctionId id = BuiltinFunctionId::kInvalidBuiltinFunctionId) {
PropertyAttributes attrs = DONT_ENUM) {
// Although function name does not have to be internalized the property name
// will be internalized during property addition anyway, so do it here now.
Handle<String> internalized_name =
isolate->factory()->InternalizeUtf8String(name);
return SimpleInstallFunction(isolate, base, internalized_name,
internalized_name, call, len, adapt, attrs, id);
Handle<JSFunction> fun =
SimpleCreateFunction(isolate, internalized_name, call, len, adapt);
JSObject::AddProperty(isolate, base, internalized_name, fun, attrs);
return fun;
}
V8_NOINLINE Handle<JSFunction> SimpleInstallFunction(
Isolate* isolate, Handle<JSObject> base, const char* name,
Builtins::Name call, int len, bool adapt, BuiltinFunctionId id) {
return SimpleInstallFunction(isolate, base, name, call, len, adapt, DONT_ENUM,
id);
V8_NOINLINE Handle<JSFunction> InstallFunctionAtSymbol(
Isolate* isolate, Handle<JSObject> base, Handle<Symbol> symbol,
const char* symbol_string, Builtins::Name call, int len, bool adapt,
PropertyAttributes attrs = DONT_ENUM,
BuiltinFunctionId id = BuiltinFunctionId::kInvalidBuiltinFunctionId) {
Handle<String> internalized_symbol =
isolate->factory()->InternalizeUtf8String(symbol_string);
Handle<JSFunction> fun =
SimpleCreateFunction(isolate, internalized_symbol, call, len, adapt);
if (id != BuiltinFunctionId::kInvalidBuiltinFunctionId) {
fun->shared()->set_builtin_function_id(id);
}
JSObject::AddProperty(isolate, base, symbol, fun, attrs);
return fun;
}
V8_NOINLINE void SimpleInstallGetterSetter(Isolate* isolate,
......@@ -1343,7 +1329,7 @@ static void InstallError(Isolate* isolate, Handle<JSObject> global,
Handle<JSFunction> error_fun = InstallFunction(
isolate, global, name, JS_ERROR_TYPE, JSObject::kHeaderSize, 0,
factory->the_hole_value(), Builtins::kErrorConstructor, DONT_ENUM);
factory->the_hole_value(), Builtins::kErrorConstructor);
error_fun->shared()->DontAdaptArguments();
error_fun->shared()->set_length(1);
......@@ -1373,7 +1359,7 @@ static void InstallError(Isolate* isolate, Handle<JSObject> global,
} else {
DCHECK(isolate->native_context()->error_to_string()->IsJSFunction());
InstallFunction(isolate, prototype, factory->toString_string(),
JSObject::AddProperty(isolate, prototype, factory->toString_string(),
isolate->error_to_string(), DONT_ENUM);
Handle<JSFunction> global_error = isolate->error_function();
......@@ -1729,10 +1715,10 @@ void Genesis::InitializeGlobal(Handle<JSGlobalObject> global_object,
1, false);
SimpleInstallFunction(isolate_, proto, "join",
Builtins::kArrayPrototypeJoin, 1, false);
SimpleInstallFunction(isolate_, proto, "keys",
InstallFunctionWithBuiltinId(isolate_, proto, "keys",
Builtins::kArrayPrototypeKeys, 0, true,
BuiltinFunctionId::kArrayKeys);
SimpleInstallFunction(isolate_, proto, "entries",
InstallFunctionWithBuiltinId(isolate_, proto, "entries",
Builtins::kArrayPrototypeEntries, 0, true,
BuiltinFunctionId::kArrayEntries);
InstallFunctionAtSymbol(isolate_, proto, factory->iterator_symbol(),
......@@ -1771,7 +1757,7 @@ void Genesis::InitializeGlobal(Handle<JSGlobalObject> global_object,
factory->ArrayIterator_string(),
static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
SimpleInstallFunction(isolate_, array_iterator_prototype, "next",
InstallFunctionWithBuiltinId(isolate_, array_iterator_prototype, "next",
Builtins::kArrayIteratorPrototypeNext, 0, true,
BuiltinFunctionId::kArrayIteratorNext);
......@@ -2118,9 +2104,9 @@ void Genesis::InitializeGlobal(Handle<JSGlobalObject> global_object,
factory->InternalizeUtf8String("String Iterator"),
static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
SimpleInstallFunction(isolate_, string_iterator_prototype, "next",
Builtins::kStringIteratorPrototypeNext, 0, true,
BuiltinFunctionId::kStringIteratorNext);
InstallFunctionWithBuiltinId(isolate_, string_iterator_prototype, "next",
Builtins::kStringIteratorPrototypeNext, 0,
true, BuiltinFunctionId::kStringIteratorNext);
Handle<JSFunction> string_iterator_function = CreateFunction(
isolate_, factory->InternalizeUtf8String("StringIterator"),
......@@ -2181,10 +2167,10 @@ void Genesis::InitializeGlobal(Handle<JSGlobalObject> global_object,
static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
// Install the Symbol.prototype methods.
SimpleInstallFunction(isolate_, prototype, "toString",
InstallFunctionWithBuiltinId(isolate_, prototype, "toString",
Builtins::kSymbolPrototypeToString, 0, true,
BuiltinFunctionId::kSymbolPrototypeToString);
SimpleInstallFunction(isolate_, prototype, "valueOf",
InstallFunctionWithBuiltinId(isolate_, prototype, "valueOf",
Builtins::kSymbolPrototypeValueOf, 0, true,
BuiltinFunctionId::kSymbolPrototypeValueOf);
......@@ -2228,7 +2214,7 @@ void Genesis::InitializeGlobal(Handle<JSGlobalObject> global_object,
Handle<JSFunction> to_utc_string =
SimpleInstallFunction(isolate_, prototype, "toUTCString",
Builtins::kDatePrototypeToUTCString, 0, false);
InstallFunction(isolate_, prototype,
JSObject::AddProperty(isolate_, prototype,
factory->InternalizeUtf8String("toGMTString"),
to_utc_string, DONT_ENUM);
SimpleInstallFunction(isolate_, prototype, "getDate",
......@@ -2351,19 +2337,20 @@ void Genesis::InitializeGlobal(Handle<JSGlobalObject> global_object,
InstallSpeciesGetter(isolate_, promise_fun);
Handle<JSFunction> promise_all = SimpleInstallFunction(
Handle<JSFunction> promise_all = InstallFunctionWithBuiltinId(
isolate_, promise_fun, "all", Builtins::kPromiseAll, 1, true,
BuiltinFunctionId::kPromiseAll);
native_context()->set_promise_all(*promise_all);
SimpleInstallFunction(isolate_, promise_fun, "race", Builtins::kPromiseRace,
1, true, BuiltinFunctionId::kPromiseRace);
InstallFunctionWithBuiltinId(isolate_, promise_fun, "race",
Builtins::kPromiseRace, 1, true,
BuiltinFunctionId::kPromiseRace);
SimpleInstallFunction(isolate_, promise_fun, "resolve",
InstallFunctionWithBuiltinId(isolate_, promise_fun, "resolve",
Builtins::kPromiseResolveTrampoline, 1, true,
BuiltinFunctionId::kPromiseResolve);
SimpleInstallFunction(isolate_, promise_fun, "reject",
InstallFunctionWithBuiltinId(isolate_, promise_fun, "reject",
Builtins::kPromiseReject, 1, true,
BuiltinFunctionId::kPromiseReject);
......@@ -2378,19 +2365,19 @@ void Genesis::InitializeGlobal(Handle<JSGlobalObject> global_object,
factory->Promise_string(),
static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
Handle<JSFunction> promise_then = SimpleInstallFunction(
Handle<JSFunction> promise_then = InstallFunctionWithBuiltinId(
isolate_, prototype, "then", Builtins::kPromisePrototypeThen, 2, true,
DONT_ENUM, BuiltinFunctionId::kPromisePrototypeThen);
BuiltinFunctionId::kPromisePrototypeThen);
native_context()->set_promise_then(*promise_then);
Handle<JSFunction> promise_catch = SimpleInstallFunction(
Handle<JSFunction> promise_catch = InstallFunctionWithBuiltinId(
isolate_, prototype, "catch", Builtins::kPromisePrototypeCatch, 1, true,
BuiltinFunctionId::kPromisePrototypeCatch);
native_context()->set_promise_catch(*promise_catch);
SimpleInstallFunction(
isolate_, prototype, "finally", Builtins::kPromisePrototypeFinally, 1,
true, DONT_ENUM, BuiltinFunctionId::kPromisePrototypeFinally);
InstallFunctionWithBuiltinId(isolate_, prototype, "finally",
Builtins::kPromisePrototypeFinally, 1, true,
BuiltinFunctionId::kPromisePrototypeFinally);
{
Handle<SharedFunctionInfo> info = SimpleCreateSharedFunctionInfo(
......@@ -3176,15 +3163,15 @@ void Genesis::InitializeGlobal(Handle<JSGlobalObject> global_object,
BuiltinFunctionId::kTypedArrayToStringTag);
// Install "keys", "values" and "entries" methods on the {prototype}.
SimpleInstallFunction(isolate_, prototype, "entries",
InstallFunctionWithBuiltinId(isolate_, prototype, "entries",
Builtins::kTypedArrayPrototypeEntries, 0, true,
BuiltinFunctionId::kTypedArrayEntries);
SimpleInstallFunction(isolate_, prototype, "keys",
InstallFunctionWithBuiltinId(isolate_, prototype, "keys",
Builtins::kTypedArrayPrototypeKeys, 0, true,
BuiltinFunctionId::kTypedArrayKeys);
Handle<JSFunction> values = SimpleInstallFunction(
Handle<JSFunction> values = InstallFunctionWithBuiltinId(
isolate_, prototype, "values", Builtins::kTypedArrayPrototypeValues, 0,
true, BuiltinFunctionId::kTypedArrayValues);
JSObject::AddProperty(isolate_, prototype, factory->iterator_symbol(),
......@@ -3617,7 +3604,7 @@ void Genesis::InitializeGlobal(Handle<JSGlobalObject> global_object,
proxy_function->shared()->set_length(2);
native_context()->set_proxy_function(*proxy_function);
InstallFunction(isolate_, global, name, proxy_function);
JSObject::AddProperty(isolate_, global, name, proxy_function, DONT_ENUM);
DCHECK(!proxy_function->has_prototype_property());
......@@ -4181,7 +4168,7 @@ void Bootstrapper::ExportFromRuntime(Isolate* isolate,
static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
// Install the next function on the {prototype}.
SimpleInstallFunction(isolate, prototype, "next",
InstallFunctionWithBuiltinId(isolate, prototype, "next",
Builtins::kSetIteratorPrototypeNext, 0, true,
BuiltinFunctionId::kSetIteratorNext);
native_context->set_initial_set_iterator_prototype(*prototype);
......@@ -4217,7 +4204,7 @@ void Bootstrapper::ExportFromRuntime(Isolate* isolate,
static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
// Install the next function on the {prototype}.
SimpleInstallFunction(isolate, prototype, "next",
InstallFunctionWithBuiltinId(isolate, prototype, "next",
Builtins::kMapIteratorPrototypeNext, 0, true,
BuiltinFunctionId::kMapIteratorNext);
native_context->set_initial_map_iterator_prototype(*prototype);
......@@ -4885,8 +4872,8 @@ Handle<JSFunction> Genesis::CreateArrayBuffer(
switch (array_buffer_kind) {
case ARRAY_BUFFER:
SimpleInstallFunction(isolate(), array_buffer_fun, "isView",
Builtins::kArrayBufferIsView, 1, true, DONT_ENUM,
InstallFunctionWithBuiltinId(isolate(), array_buffer_fun, "isView",
Builtins::kArrayBufferIsView, 1, true,
BuiltinFunctionId::kArrayBufferIsView);
// Install the "byteLength" getter on the {prototype}.
......@@ -4975,31 +4962,31 @@ bool Genesis::InstallNatives(GlobalContextType context_type) {
SimpleCreateFunction(isolate(), factory()->empty_string(),
Builtins::kPromiseInternalConstructor, 1, true);
promise_internal_constructor->shared()->set_native(false);
InstallFunction(isolate(), extras_utils,
JSObject::AddProperty(isolate(), extras_utils,
factory()->InternalizeUtf8String("createPromise"),
promise_internal_constructor);
promise_internal_constructor, DONT_ENUM);
// v8.rejectPromise(promise, reason)
Handle<JSFunction> promise_internal_reject =
SimpleCreateFunction(isolate(), factory()->empty_string(),
Builtins::kPromiseInternalReject, 2, true);
promise_internal_reject->shared()->set_native(false);
InstallFunction(isolate(), extras_utils,
JSObject::AddProperty(isolate(), extras_utils,
factory()->InternalizeUtf8String("rejectPromise"),
promise_internal_reject);
promise_internal_reject, DONT_ENUM);
// v8.resolvePromise(promise, resolution)
Handle<JSFunction> promise_internal_resolve =
SimpleCreateFunction(isolate(), factory()->empty_string(),
Builtins::kPromiseInternalResolve, 2, true);
promise_internal_resolve->shared()->set_native(false);
InstallFunction(isolate(), extras_utils,
JSObject::AddProperty(isolate(), extras_utils,
factory()->InternalizeUtf8String("resolvePromise"),
promise_internal_resolve);
promise_internal_resolve, DONT_ENUM);
InstallFunction(isolate(), extras_utils,
JSObject::AddProperty(isolate(), extras_utils,
factory()->InternalizeUtf8String("isPromise"),
isolate()->is_promise());
isolate()->is_promise(), DONT_ENUM);
int builtin_index = Natives::GetDebuggerCount();
// Only run prologue.js at this point.
......@@ -5073,32 +5060,32 @@ bool Genesis::InstallNatives(GlobalContextType context_type) {
handle(native_context()->global_object(), isolate());
// Install Global.decodeURI.
SimpleInstallFunction(isolate(), global_object, "decodeURI",
InstallFunctionWithBuiltinId(isolate(), global_object, "decodeURI",
Builtins::kGlobalDecodeURI, 1, false,
BuiltinFunctionId::kGlobalDecodeURI);
// Install Global.decodeURIComponent.
SimpleInstallFunction(isolate(), global_object, "decodeURIComponent",
InstallFunctionWithBuiltinId(isolate(), global_object, "decodeURIComponent",
Builtins::kGlobalDecodeURIComponent, 1, false,
BuiltinFunctionId::kGlobalDecodeURIComponent);
// Install Global.encodeURI.
SimpleInstallFunction(isolate(), global_object, "encodeURI",
InstallFunctionWithBuiltinId(isolate(), global_object, "encodeURI",
Builtins::kGlobalEncodeURI, 1, false,
BuiltinFunctionId::kGlobalEncodeURI);
// Install Global.encodeURIComponent.
SimpleInstallFunction(isolate(), global_object, "encodeURIComponent",
InstallFunctionWithBuiltinId(isolate(), global_object, "encodeURIComponent",
Builtins::kGlobalEncodeURIComponent, 1, false,
BuiltinFunctionId::kGlobalEncodeURIComponent);
// Install Global.escape.
SimpleInstallFunction(isolate(), global_object, "escape",
InstallFunctionWithBuiltinId(isolate(), global_object, "escape",
Builtins::kGlobalEscape, 1, false,
BuiltinFunctionId::kGlobalEscape);
// Install Global.unescape.
SimpleInstallFunction(isolate(), global_object, "unescape",
InstallFunctionWithBuiltinId(isolate(), global_object, "unescape",
Builtins::kGlobalUnescape, 1, false,
BuiltinFunctionId::kGlobalUnescape);
......@@ -5110,12 +5097,12 @@ bool Genesis::InstallNatives(GlobalContextType context_type) {
}
// Install Global.isFinite
SimpleInstallFunction(isolate(), global_object, "isFinite",
InstallFunctionWithBuiltinId(isolate(), global_object, "isFinite",
Builtins::kGlobalIsFinite, 1, true,
BuiltinFunctionId::kGlobalIsFinite);
// Install Global.isNaN
SimpleInstallFunction(isolate(), global_object, "isNaN",
InstallFunctionWithBuiltinId(isolate(), global_object, "isNaN",
Builtins::kGlobalIsNaN, 1, true,
BuiltinFunctionId::kGlobalIsNaN);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment