Index: src/bootstrapper.cc |
diff --git a/src/bootstrapper.cc b/src/bootstrapper.cc |
index 111c2696c865c570375d23bc05ab4764e04bb0d5..cd05e7b13f9bfb56f0770f2bb672f605778382df 100644 |
--- a/src/bootstrapper.cc |
+++ b/src/bootstrapper.cc |
@@ -379,6 +379,16 @@ void InstallFunction(Handle<JSObject> target, Handle<JSFunction> function, |
InstallFunction(target, name, function, name_string, attributes); |
} |
+Handle<JSFunction> InstallGetter(Handle<JSObject> target, |
+ Handle<Name> property_name, |
+ Handle<JSFunction> getter, |
+ PropertyAttributes attributes = DONT_ENUM) { |
+ Handle<Object> setter = target->GetIsolate()->factory()->undefined_value(); |
+ JSObject::DefineAccessor(target, property_name, getter, setter, attributes) |
+ .Check(); |
+ return getter; |
+} |
+ |
Handle<JSFunction> CreateFunction(Isolate* isolate, Handle<String> name, |
InstanceType type, int instance_size, |
MaybeHandle<JSObject> maybe_prototype, |
@@ -456,6 +466,27 @@ Handle<JSFunction> SimpleInstallFunction(Handle<JSObject> base, |
len, adapt); |
} |
+Handle<JSFunction> SimpleInstallGetter(Handle<JSObject> base, |
+ Handle<String> name, Builtins::Name call, |
+ bool adapt) { |
+ Isolate* const isolate = base->GetIsolate(); |
+ Handle<String> fun_name = |
+ Name::ToFunctionName(name, isolate->factory()->get_string()) |
+ .ToHandleChecked(); |
+ Handle<JSFunction> fun = |
+ SimpleCreateFunction(isolate, fun_name, call, 0, adapt); |
+ InstallGetter(base, name, fun); |
+ return fun; |
+} |
+ |
+Handle<JSFunction> SimpleInstallGetter(Handle<JSObject> base, |
+ Handle<String> name, Builtins::Name call, |
+ bool adapt, BuiltinFunctionId id) { |
+ Handle<JSFunction> fun = SimpleInstallGetter(base, name, call, adapt); |
+ fun->shared()->set_builtin_function_id(id); |
+ return fun; |
+} |
+ |
} // namespace |
void Genesis::SetFunctionInstanceDescriptor(Handle<Map> map, |
@@ -1654,6 +1685,36 @@ void Genesis::InitializeGlobal(Handle<JSGlobalObject> global_object, |
Context::ARRAY_BUFFER_FUN_INDEX); |
} |
+ { // -- T y p e d A r r a y |
+ Handle<JSObject> prototype = |
+ factory->NewJSObject(isolate->object_function(), TENURED); |
+ native_context()->set_typed_array_prototype(*prototype); |
+ |
+ Handle<JSFunction> typed_array_fun = |
+ CreateFunction(isolate, factory->InternalizeUtf8String("TypedArray"), |
+ JS_TYPED_ARRAY_TYPE, JSTypedArray::kSize, prototype, |
+ Builtins::kIllegal); |
+ |
+ // Install the "constructor" property on the {prototype}. |
+ JSObject::AddProperty(prototype, factory->constructor_string(), |
+ typed_array_fun, DONT_ENUM); |
+ native_context()->set_typed_array_function(*typed_array_fun); |
+ |
+ // Install the "buffer", "byteOffset", "byteLength" and "length" |
+ // getters on the {prototype}. |
+ SimpleInstallGetter(prototype, factory->buffer_string(), |
+ Builtins::kTypedArrayPrototypeBuffer, false); |
+ SimpleInstallGetter(prototype, factory->byte_length_string(), |
+ Builtins::kTypedArrayPrototypeByteLength, true, |
+ kTypedArrayByteLength); |
+ SimpleInstallGetter(prototype, factory->byte_offset_string(), |
+ Builtins::kTypedArrayPrototypeByteOffset, true, |
+ kTypedArrayByteOffset); |
+ SimpleInstallGetter(prototype, factory->length_string(), |
+ Builtins::kTypedArrayPrototypeLength, true, |
+ kTypedArrayLength); |
+ } |
+ |
{ // -- T y p e d A r r a y s |
#define INSTALL_TYPED_ARRAY(Type, type, TYPE, ctype, size) \ |
{ \ |
@@ -1664,17 +1725,43 @@ void Genesis::InitializeGlobal(Handle<JSGlobalObject> global_object, |
} |
TYPED_ARRAYS(INSTALL_TYPED_ARRAY) |
#undef INSTALL_TYPED_ARRAY |
+ } |
- Handle<JSFunction> data_view_fun = InstallFunction( |
- global, "DataView", JS_DATA_VIEW_TYPE, |
- JSDataView::kSizeWithInternalFields, |
- isolate->initial_object_prototype(), Builtins::kDataViewConstructor); |
+ { // -- D a t a V i e w |
+ Handle<JSObject> prototype = |
+ factory->NewJSObject(isolate->object_function(), TENURED); |
+ Handle<JSFunction> data_view_fun = |
+ InstallFunction(global, "DataView", JS_DATA_VIEW_TYPE, |
+ JSDataView::kSizeWithInternalFields, prototype, |
+ Builtins::kDataViewConstructor); |
InstallWithIntrinsicDefaultProto(isolate, data_view_fun, |
Context::DATA_VIEW_FUN_INDEX); |
data_view_fun->shared()->set_construct_stub( |
*isolate->builtins()->DataViewConstructor_ConstructStub()); |
data_view_fun->shared()->set_length(3); |
data_view_fun->shared()->DontAdaptArguments(); |
+ |
+ // Install the @@toStringTag property on the {prototype}. |
+ JSObject::AddProperty( |
+ prototype, factory->to_string_tag_symbol(), |
+ factory->NewStringFromAsciiChecked("DataView"), |
+ static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY)); |
+ |
+ // Install the "constructor" property on the {prototype}. |
+ JSObject::AddProperty(prototype, factory->constructor_string(), |
+ data_view_fun, DONT_ENUM); |
+ |
+ // Install the "buffer", "byteOffset" and "byteLength" getters |
+ // on the {prototype}. |
+ SimpleInstallGetter(prototype, factory->buffer_string(), |
+ Builtins::kDataViewPrototypeGetBuffer, false, |
+ kDataViewBuffer); |
+ SimpleInstallGetter(prototype, factory->byte_length_string(), |
+ Builtins::kDataViewPrototypeGetByteLength, false, |
+ kDataViewByteLength); |
+ SimpleInstallGetter(prototype, factory->byte_offset_string(), |
+ Builtins::kDataViewPrototypeGetByteOffset, false, |
+ kDataViewByteOffset); |
} |
{ // -- M a p |
@@ -1973,13 +2060,20 @@ void Genesis::InitializeGlobal(Handle<JSGlobalObject> global_object, |
} |
} // NOLINT(readability/fn_size) |
- |
void Genesis::InstallTypedArray(const char* name, ElementsKind elements_kind, |
Handle<JSFunction>* fun) { |
Handle<JSObject> global = Handle<JSObject>(native_context()->global_object()); |
- Handle<JSFunction> result = InstallFunction( |
- global, name, JS_TYPED_ARRAY_TYPE, JSTypedArray::kSize, |
- isolate()->initial_object_prototype(), Builtins::kIllegal); |
+ |
+ Handle<JSObject> typed_array_prototype = |
+ Handle<JSObject>(isolate()->typed_array_prototype()); |
+ Handle<JSFunction> typed_array_function = |
+ Handle<JSFunction>(isolate()->typed_array_function()); |
+ |
+ Handle<JSObject> prototype = |
+ factory()->NewJSObject(isolate()->object_function(), TENURED); |
+ Handle<JSFunction> result = |
+ InstallFunction(global, name, JS_TYPED_ARRAY_TYPE, JSTypedArray::kSize, |
+ prototype, Builtins::kIllegal); |
Handle<Map> initial_map = isolate()->factory()->NewMap( |
JS_TYPED_ARRAY_TYPE, |
@@ -1987,6 +2081,14 @@ void Genesis::InstallTypedArray(const char* name, ElementsKind elements_kind, |
elements_kind); |
JSFunction::SetInitialMap(result, initial_map, |
handle(initial_map->prototype(), isolate())); |
+ |
+ CHECK(JSObject::SetPrototype(result, typed_array_function, false, |
+ Object::DONT_THROW) |
+ .FromJust()); |
+ |
+ CHECK(JSObject::SetPrototype(prototype, typed_array_prototype, false, |
+ Object::DONT_THROW) |
+ .FromJust()); |
*fun = result; |
} |