| Index: src/bootstrapper.cc
|
| diff --git a/src/bootstrapper.cc b/src/bootstrapper.cc
|
| index 0c6622cd4e721ee545f79dde712fd196a77eafb2..93f9151117605b757bbf6ef8db6d32942bd4c9bc 100644
|
| --- a/src/bootstrapper.cc
|
| +++ b/src/bootstrapper.cc
|
| @@ -380,20 +380,34 @@
|
| }
|
|
|
|
|
| -static Handle<JSFunction> InstallConstructor(
|
| - Handle<JSObject> target, const char* name, InstanceType type,
|
| - int instance_size, Handle<JSObject> prototype, Builtins::Name call,
|
| - bool strict_function_map = false) {
|
| +static Handle<JSFunction> InstallFunction(Handle<JSObject> target,
|
| + const char* name, InstanceType type,
|
| + int instance_size,
|
| + MaybeHandle<JSObject> maybe_prototype,
|
| + Builtins::Name call,
|
| + bool strict_function_map = false) {
|
| Isolate* isolate = target->GetIsolate();
|
| Factory* factory = isolate->factory();
|
| Handle<String> internalized_name = factory->InternalizeUtf8String(name);
|
| Handle<Code> call_code = Handle<Code>(isolate->builtins()->builtin(call));
|
| + Handle<JSObject> prototype;
|
| static const bool kReadOnlyPrototype = false;
|
| static const bool kInstallConstructor = false;
|
| - Handle<JSFunction> function = factory->NewFunction(
|
| - internalized_name, call_code, prototype, type, instance_size,
|
| - kReadOnlyPrototype, kInstallConstructor, strict_function_map);
|
| - JSObject::AddProperty(target, internalized_name, function, DONT_ENUM);
|
| + Handle<JSFunction> function =
|
| + maybe_prototype.ToHandle(&prototype)
|
| + ? factory->NewFunction(internalized_name, call_code, prototype, type,
|
| + instance_size, kReadOnlyPrototype,
|
| + kInstallConstructor, strict_function_map)
|
| + : factory->NewFunctionWithoutPrototype(internalized_name, call_code,
|
| + strict_function_map);
|
| + PropertyAttributes attributes;
|
| + if (target->IsJSBuiltinsObject()) {
|
| + attributes =
|
| + static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY);
|
| + } else {
|
| + attributes = DONT_ENUM;
|
| + }
|
| + JSObject::AddProperty(target, internalized_name, function, attributes);
|
| if (target->IsJSGlobalObject()) {
|
| function->shared()->set_instance_class_name(*internalized_name);
|
| }
|
| @@ -401,23 +415,6 @@
|
| return function;
|
| }
|
|
|
| -
|
| -static Handle<JSFunction> InstallFunction(Isolate* isolate,
|
| - Handle<JSObject> target,
|
| - const char* name, Builtins::Name call,
|
| - int length,
|
| - bool dont_adapt_arguments = true) {
|
| - Factory* factory = isolate->factory();
|
| - Handle<String> name_string = factory->InternalizeUtf8String(name);
|
| - Handle<Code> call_code = Handle<Code>(isolate->builtins()->builtin(call));
|
| - Handle<JSFunction> function =
|
| - factory->NewFunctionWithoutPrototype(name_string, call_code);
|
| - function->shared()->set_length(length);
|
| - function->shared()->set_native(true);
|
| - if (dont_adapt_arguments) function->shared()->DontAdaptArguments();
|
| - JSObject::AddProperty(target, name_string, function, DONT_ENUM);
|
| - return function;
|
| -}
|
|
|
| void Genesis::SetFunctionInstanceDescriptor(Handle<Map> map,
|
| FunctionMode function_mode) {
|
| @@ -1030,13 +1027,14 @@
|
| Handle<JSObject> global(native_context()->global_object());
|
|
|
| // Install global Function object
|
| - InstallConstructor(global, "Function", JS_FUNCTION_TYPE, JSFunction::kSize,
|
| - empty_function, Builtins::kIllegal);
|
| + InstallFunction(global, "Function", JS_FUNCTION_TYPE, JSFunction::kSize,
|
| + empty_function, Builtins::kIllegal);
|
|
|
| { // --- A r r a y ---
|
| - Handle<JSFunction> array_function = InstallConstructor(
|
| - global, "Array", JS_ARRAY_TYPE, JSArray::kSize,
|
| - isolate->initial_object_prototype(), Builtins::kArrayCode);
|
| + Handle<JSFunction> array_function =
|
| + InstallFunction(global, "Array", JS_ARRAY_TYPE, JSArray::kSize,
|
| + isolate->initial_object_prototype(),
|
| + Builtins::kArrayCode);
|
| array_function->shared()->DontAdaptArguments();
|
| array_function->shared()->set_function_data(Smi::FromInt(kArrayCode));
|
|
|
| @@ -1082,23 +1080,26 @@
|
| }
|
|
|
| { // --- N u m b e r ---
|
| - Handle<JSFunction> number_fun = InstallConstructor(
|
| - global, "Number", JS_VALUE_TYPE, JSValue::kSize,
|
| - isolate->initial_object_prototype(), Builtins::kIllegal);
|
| + Handle<JSFunction> number_fun =
|
| + InstallFunction(global, "Number", JS_VALUE_TYPE, JSValue::kSize,
|
| + isolate->initial_object_prototype(),
|
| + Builtins::kIllegal);
|
| native_context()->set_number_function(*number_fun);
|
| }
|
|
|
| { // --- B o o l e a n ---
|
| - Handle<JSFunction> boolean_fun = InstallConstructor(
|
| - global, "Boolean", JS_VALUE_TYPE, JSValue::kSize,
|
| - isolate->initial_object_prototype(), Builtins::kIllegal);
|
| + Handle<JSFunction> boolean_fun =
|
| + InstallFunction(global, "Boolean", JS_VALUE_TYPE, JSValue::kSize,
|
| + isolate->initial_object_prototype(),
|
| + Builtins::kIllegal);
|
| native_context()->set_boolean_function(*boolean_fun);
|
| }
|
|
|
| { // --- S t r i n g ---
|
| - Handle<JSFunction> string_fun = InstallConstructor(
|
| - global, "String", JS_VALUE_TYPE, JSValue::kSize,
|
| - isolate->initial_object_prototype(), Builtins::kIllegal);
|
| + Handle<JSFunction> string_fun =
|
| + InstallFunction(global, "String", JS_VALUE_TYPE, JSValue::kSize,
|
| + isolate->initial_object_prototype(),
|
| + Builtins::kIllegal);
|
| string_fun->shared()->set_construct_stub(
|
| isolate->builtins()->builtin(Builtins::kStringConstructCode));
|
| native_context()->set_string_function(*string_fun);
|
| @@ -1121,7 +1122,7 @@
|
|
|
| {
|
| // --- S y m b o l ---
|
| - Handle<JSFunction> symbol_fun = InstallConstructor(
|
| + Handle<JSFunction> symbol_fun = InstallFunction(
|
| global, "Symbol", JS_VALUE_TYPE, JSValue::kSize,
|
| isolate->initial_object_prototype(), Builtins::kIllegal);
|
| native_context()->set_symbol_function(*symbol_fun);
|
| @@ -1129,16 +1130,17 @@
|
|
|
| { // --- D a t e ---
|
| // Builtin functions for Date.prototype.
|
| - InstallConstructor(global, "Date", JS_DATE_TYPE, JSDate::kSize,
|
| - isolate->initial_object_prototype(), Builtins::kIllegal);
|
| + InstallFunction(global, "Date", JS_DATE_TYPE, JSDate::kSize,
|
| + isolate->initial_object_prototype(), Builtins::kIllegal);
|
| }
|
|
|
|
|
| { // -- R e g E x p
|
| // Builtin functions for RegExp.prototype.
|
| - Handle<JSFunction> regexp_fun = InstallConstructor(
|
| - global, "RegExp", JS_REGEXP_TYPE, JSRegExp::kSize,
|
| - isolate->initial_object_prototype(), Builtins::kIllegal);
|
| + Handle<JSFunction> regexp_fun =
|
| + InstallFunction(global, "RegExp", JS_REGEXP_TYPE, JSRegExp::kSize,
|
| + isolate->initial_object_prototype(),
|
| + Builtins::kIllegal);
|
| native_context()->set_regexp_function(*regexp_fun);
|
|
|
| DCHECK(regexp_fun->has_initial_map());
|
| @@ -1246,10 +1248,12 @@
|
| }
|
|
|
| { // -- A r r a y B u f f e r
|
| - Handle<JSFunction> array_buffer_fun = InstallConstructor(
|
| - global, "ArrayBuffer", JS_ARRAY_BUFFER_TYPE,
|
| - JSArrayBuffer::kSizeWithInternalFields,
|
| - isolate->initial_object_prototype(), Builtins::kIllegal);
|
| + Handle<JSFunction> array_buffer_fun =
|
| + InstallFunction(
|
| + global, "ArrayBuffer", JS_ARRAY_BUFFER_TYPE,
|
| + JSArrayBuffer::kSizeWithInternalFields,
|
| + isolate->initial_object_prototype(),
|
| + Builtins::kIllegal);
|
| native_context()->set_array_buffer_fun(*array_buffer_fun);
|
| }
|
|
|
| @@ -1263,22 +1267,24 @@
|
| TYPED_ARRAYS(INSTALL_TYPED_ARRAY)
|
| #undef INSTALL_TYPED_ARRAY
|
|
|
| - Handle<JSFunction> data_view_fun = InstallConstructor(
|
| - global, "DataView", JS_DATA_VIEW_TYPE,
|
| - JSDataView::kSizeWithInternalFields,
|
| - isolate->initial_object_prototype(), Builtins::kIllegal);
|
| + Handle<JSFunction> data_view_fun =
|
| + InstallFunction(
|
| + global, "DataView", JS_DATA_VIEW_TYPE,
|
| + JSDataView::kSizeWithInternalFields,
|
| + isolate->initial_object_prototype(),
|
| + Builtins::kIllegal);
|
| native_context()->set_data_view_fun(*data_view_fun);
|
| }
|
|
|
| { // -- M a p
|
| - Handle<JSFunction> js_map_fun = InstallConstructor(
|
| + Handle<JSFunction> js_map_fun = InstallFunction(
|
| global, "Map", JS_MAP_TYPE, JSMap::kSize,
|
| isolate->initial_object_prototype(), Builtins::kIllegal);
|
| native_context()->set_js_map_fun(*js_map_fun);
|
| }
|
|
|
| { // -- S e t
|
| - Handle<JSFunction> js_set_fun = InstallConstructor(
|
| + Handle<JSFunction> js_set_fun = InstallFunction(
|
| global, "Set", JS_SET_TYPE, JSSet::kSize,
|
| isolate->initial_object_prototype(), Builtins::kIllegal);
|
| native_context()->set_js_set_fun(*js_set_fun);
|
| @@ -1313,11 +1319,11 @@
|
| }
|
|
|
| // -- W e a k M a p
|
| - InstallConstructor(global, "WeakMap", JS_WEAK_MAP_TYPE, JSWeakMap::kSize,
|
| - isolate->initial_object_prototype(), Builtins::kIllegal);
|
| + InstallFunction(global, "WeakMap", JS_WEAK_MAP_TYPE, JSWeakMap::kSize,
|
| + isolate->initial_object_prototype(), Builtins::kIllegal);
|
| // -- W e a k S e t
|
| - InstallConstructor(global, "WeakSet", JS_WEAK_SET_TYPE, JSWeakSet::kSize,
|
| - isolate->initial_object_prototype(), Builtins::kIllegal);
|
| + InstallFunction(global, "WeakSet", JS_WEAK_SET_TYPE, JSWeakSet::kSize,
|
| + isolate->initial_object_prototype(), Builtins::kIllegal);
|
|
|
| { // --- sloppy arguments map
|
| // Make sure we can recognize argument objects at runtime.
|
| @@ -1471,7 +1477,7 @@
|
| void Genesis::InstallTypedArray(const char* name, ElementsKind elements_kind,
|
| Handle<JSFunction>* fun) {
|
| Handle<JSObject> global = Handle<JSObject>(native_context()->global_object());
|
| - Handle<JSFunction> result = InstallConstructor(
|
| + Handle<JSFunction> result = InstallFunction(
|
| global, name, JS_TYPED_ARRAY_TYPE, JSTypedArray::kSize,
|
| isolate()->initial_object_prototype(), Builtins::kIllegal);
|
|
|
| @@ -1611,7 +1617,8 @@
|
| bool Genesis::CallUtilsFunction(Isolate* isolate, const char* name) {
|
| Handle<JSObject> utils =
|
| Handle<JSObject>::cast(isolate->natives_utils_object());
|
| - Handle<String> name_string = isolate->factory()->InternalizeUtf8String(name);
|
| + Handle<String> name_string =
|
| + isolate->factory()->NewStringFromAsciiChecked(name);
|
| Handle<Object> fun = JSObject::GetDataProperty(utils, name_string);
|
| Handle<Object> receiver = isolate->factory()->undefined_value();
|
| Handle<Object> args[] = {utils};
|
| @@ -1754,7 +1761,7 @@
|
| HandleScope scope(isolate);
|
| #define EXPORT_PRIVATE_SYMBOL(NAME) \
|
| Handle<String> NAME##_name = \
|
| - isolate->factory()->InternalizeUtf8String(#NAME); \
|
| + isolate->factory()->NewStringFromAsciiChecked(#NAME); \
|
| JSObject::AddProperty(container, NAME##_name, isolate->factory()->NAME(), \
|
| NONE);
|
| PRIVATE_SYMBOL_LIST(EXPORT_PRIVATE_SYMBOL)
|
| @@ -1762,44 +1769,38 @@
|
|
|
| #define EXPORT_PUBLIC_SYMBOL(NAME, DESCRIPTION) \
|
| Handle<String> NAME##_name = \
|
| - isolate->factory()->InternalizeUtf8String(#NAME); \
|
| + isolate->factory()->NewStringFromAsciiChecked(#NAME); \
|
| JSObject::AddProperty(container, NAME##_name, isolate->factory()->NAME(), \
|
| NONE);
|
| PUBLIC_SYMBOL_LIST(EXPORT_PUBLIC_SYMBOL)
|
| #undef EXPORT_PUBLIC_SYMBOL
|
|
|
| Handle<JSFunction> apply = InstallFunction(
|
| - isolate, container, "reflect_apply", Builtins::kReflectApply, 3, false);
|
| + container, "reflect_apply", JS_OBJECT_TYPE, JSObject::kHeaderSize,
|
| + MaybeHandle<JSObject>(), Builtins::kReflectApply);
|
| + apply->shared()->set_internal_formal_parameter_count(3);
|
| + apply->shared()->set_length(3);
|
| isolate->native_context()->set_reflect_apply(*apply);
|
| - apply->shared()->set_internal_formal_parameter_count(3);
|
| -
|
| - Handle<JSFunction> construct =
|
| - InstallFunction(isolate, container, "reflect_construct",
|
| - Builtins::kReflectConstruct, 2, false);
|
| +
|
| + Handle<JSFunction> construct = InstallFunction(
|
| + container, "reflect_construct", JS_OBJECT_TYPE, JSObject::kHeaderSize,
|
| + MaybeHandle<JSObject>(), Builtins::kReflectConstruct);
|
| + construct->shared()->set_internal_formal_parameter_count(3);
|
| + construct->shared()->set_length(2);
|
| isolate->native_context()->set_reflect_construct(*construct);
|
| - construct->shared()->set_internal_formal_parameter_count(3);
|
| -
|
| - InstallFunction(isolate, container, "array_concat", Builtins::kArrayConcat,
|
| - 1);
|
| - InstallFunction(isolate, container, "array_pop", Builtins::kArrayPop, 0);
|
| - InstallFunction(isolate, container, "array_push", Builtins::kArrayPush, 1);
|
| - InstallFunction(isolate, container, "array_shift", Builtins::kArrayShift, 0);
|
| - InstallFunction(isolate, container, "array_slice", Builtins::kArraySlice, 2);
|
| - InstallFunction(isolate, container, "array_splice", Builtins::kArraySplice,
|
| - 2);
|
| - InstallFunction(isolate, container, "array_unshift", Builtins::kArrayUnshift,
|
| - 1);
|
| -}
|
| +}
|
| +
|
|
|
| void Bootstrapper::ExportExperimentalFromRuntime(Isolate* isolate,
|
| Handle<JSObject> container) {
|
| HandleScope scope(isolate);
|
|
|
| -#define INITIALIZE_FLAG(FLAG) \
|
| - { \
|
| - Handle<String> name = isolate->factory()->InternalizeUtf8String(#FLAG); \
|
| - JSObject::AddProperty(container, name, \
|
| - isolate->factory()->ToBoolean(FLAG), NONE); \
|
| +#define INITIALIZE_FLAG(FLAG) \
|
| + { \
|
| + Handle<String> name = \
|
| + isolate->factory()->NewStringFromAsciiChecked(#FLAG); \
|
| + JSObject::AddProperty(container, name, \
|
| + isolate->factory()->ToBoolean(FLAG), NONE); \
|
| }
|
|
|
| INITIALIZE_FLAG(FLAG_harmony_regexps)
|
| @@ -1838,8 +1839,8 @@
|
| void Genesis::InitializeGlobal_harmony_reflect() {
|
| if (!FLAG_harmony_reflect) return;
|
|
|
| - Handle<JSGlobalObject> global(
|
| - JSGlobalObject::cast(native_context()->global_object()));
|
| + Handle<JSGlobalObject> global(JSGlobalObject::cast(
|
| + native_context()->global_object()));
|
| Handle<String> reflect_string =
|
| factory()->NewStringFromStaticChars("Reflect");
|
| Handle<Object> reflect =
|
| @@ -1848,13 +1849,14 @@
|
| }
|
|
|
|
|
| +
|
| void Genesis::InitializeGlobal_harmony_sharedarraybuffer() {
|
| if (!FLAG_harmony_sharedarraybuffer) return;
|
|
|
| Handle<JSGlobalObject> global(
|
| JSGlobalObject::cast(native_context()->global_object()));
|
|
|
| - Handle<JSFunction> shared_array_buffer_fun = InstallConstructor(
|
| + Handle<JSFunction> shared_array_buffer_fun = InstallFunction(
|
| global, "SharedArrayBuffer", JS_ARRAY_BUFFER_TYPE,
|
| JSArrayBuffer::kSizeWithInternalFields,
|
| isolate()->initial_object_prototype(), Builtins::kIllegal);
|
| @@ -1881,9 +1883,9 @@
|
| JSObject::AddProperty(global, name, simd_object, DONT_ENUM);
|
|
|
| // Install SIMD type functions. Set the instance class names since
|
| -// InstallConstructor only does this when we install on the GlobalObject.
|
| +// InstallFunction only does this when we install on the GlobalObject.
|
| #define SIMD128_INSTALL_FUNCTION(TYPE, Type, type, lane_count, lane_type) \
|
| - Handle<JSFunction> type##_function = InstallConstructor( \
|
| + Handle<JSFunction> type##_function = InstallFunction( \
|
| simd_object, #Type, JS_VALUE_TYPE, JSValue::kSize, \
|
| isolate->initial_object_prototype(), Builtins::kIllegal); \
|
| native_context()->set_##type##_function(*type##_function); \
|
| @@ -1905,8 +1907,8 @@
|
| Handle<JSObject> prototype =
|
| factory()->NewJSObject(isolate()->object_function(), TENURED);
|
| Handle<JSFunction> array_function =
|
| - InstallConstructor(target, name, JS_ARRAY_TYPE, JSArray::kSize, prototype,
|
| - Builtins::kInternalArrayCode);
|
| + InstallFunction(target, name, JS_ARRAY_TYPE, JSArray::kSize, prototype,
|
| + Builtins::kInternalArrayCode);
|
|
|
| InternalArrayConstructorStub internal_array_constructor_stub(isolate());
|
| Handle<Code> code = internal_array_constructor_stub.GetCode();
|
| @@ -2001,13 +2003,13 @@
|
| if (context_type == THIN_CONTEXT) return true;
|
|
|
| if (FLAG_expose_natives_as != NULL) {
|
| - Handle<String> utils_key = factory()->InternalizeUtf8String("utils");
|
| + Handle<String> utils_key = factory()->NewStringFromAsciiChecked("utils");
|
| JSObject::AddProperty(builtins, utils_key, utils, NONE);
|
| }
|
|
|
| { // -- S c r i p t
|
| // Builtin functions for Script.
|
| - Handle<JSFunction> script_fun = InstallConstructor(
|
| + Handle<JSFunction> script_fun = InstallFunction(
|
| builtins, "Script", JS_VALUE_TYPE, JSValue::kSize,
|
| isolate()->initial_object_prototype(), Builtins::kIllegal);
|
| Handle<JSObject> prototype =
|
| @@ -2157,7 +2159,7 @@
|
| // Builtin function for OpaqueReference -- a JSValue-based object,
|
| // that keeps its field isolated from JavaScript code. It may store
|
| // objects, that JavaScript code may not access.
|
| - Handle<JSFunction> opaque_reference_fun = InstallConstructor(
|
| + Handle<JSFunction> opaque_reference_fun = InstallFunction(
|
| builtins, "OpaqueReference", JS_VALUE_TYPE, JSValue::kSize,
|
| isolate()->initial_object_prototype(), Builtins::kIllegal);
|
| Handle<JSObject> prototype =
|
| @@ -2182,7 +2184,7 @@
|
| }
|
|
|
| { // -- S e t I t e r a t o r
|
| - Handle<JSFunction> set_iterator_function = InstallConstructor(
|
| + Handle<JSFunction> set_iterator_function = InstallFunction(
|
| builtins, "SetIterator", JS_SET_ITERATOR_TYPE, JSSetIterator::kSize,
|
| isolate()->initial_object_prototype(), Builtins::kIllegal);
|
| native_context()->set_set_iterator_map(
|
| @@ -2190,7 +2192,7 @@
|
| }
|
|
|
| { // -- M a p I t e r a t o r
|
| - Handle<JSFunction> map_iterator_function = InstallConstructor(
|
| + Handle<JSFunction> map_iterator_function = InstallFunction(
|
| builtins, "MapIterator", JS_MAP_ITERATOR_TYPE, JSMapIterator::kSize,
|
| isolate()->initial_object_prototype(), Builtins::kIllegal);
|
| native_context()->set_map_iterator_map(
|
| @@ -2224,9 +2226,9 @@
|
| static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
|
|
|
| static const bool kUseStrictFunctionMap = true;
|
| - InstallConstructor(builtins, "GeneratorFunction", JS_FUNCTION_TYPE,
|
| - JSFunction::kSize, generator_function_prototype,
|
| - Builtins::kIllegal, kUseStrictFunctionMap);
|
| + InstallFunction(builtins, "GeneratorFunction", JS_FUNCTION_TYPE,
|
| + JSFunction::kSize, generator_function_prototype,
|
| + Builtins::kIllegal, kUseStrictFunctionMap);
|
|
|
| // Create maps for generator functions and their prototypes. Store those
|
| // maps in the native context. The "prototype" property descriptor is
|
| @@ -2300,17 +2302,24 @@
|
|
|
| // Install the call and the apply functions.
|
| Handle<JSFunction> call =
|
| - InstallFunction(isolate(), proto, "call", Builtins::kFunctionCall, 1);
|
| + InstallFunction(proto, "call", JS_OBJECT_TYPE, JSObject::kHeaderSize,
|
| + MaybeHandle<JSObject>(), Builtins::kFunctionCall);
|
| + Handle<JSFunction> apply =
|
| + InstallFunction(proto, "apply", JS_OBJECT_TYPE, JSObject::kHeaderSize,
|
| + MaybeHandle<JSObject>(), Builtins::kFunctionApply);
|
| +
|
| // Make sure that Function.prototype.call appears to be compiled.
|
| // The code will never be called, but inline caching for call will
|
| // only work if it appears to be compiled.
|
| + call->shared()->DontAdaptArguments();
|
| DCHECK(call->is_compiled());
|
| - USE(call);
|
| -
|
| - Handle<JSFunction> apply = InstallFunction(
|
| - isolate(), proto, "apply", Builtins::kFunctionApply, 2, false);
|
| +
|
| // Set the expected parameters for apply to 2; required by builtin.
|
| apply->shared()->set_internal_formal_parameter_count(2);
|
| +
|
| + // Set the lengths for the functions to satisfy ECMA-262.
|
| + call->shared()->set_length(1);
|
| + apply->shared()->set_length(2);
|
| }
|
|
|
| InstallBuiltinFunctionIds();
|
|
|