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

Side by Side Diff: src/bootstrapper.cc

Issue 2046333002: Revert "Revert of [builtins] Properly optimize TypedArray/DataView accessors. (patchset #3 id:40001… (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Remove TypedArray from global object Created 4 years, 6 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 unified diff | Download patch
« no previous file with comments | « no previous file | src/builtins.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/bootstrapper.h" 5 #include "src/bootstrapper.h"
6 6
7 #include "src/accessors.h" 7 #include "src/accessors.h"
8 #include "src/api-natives.h" 8 #include "src/api-natives.h"
9 #include "src/code-stubs.h" 9 #include "src/code-stubs.h"
10 #include "src/extensions/externalize-string-extension.h" 10 #include "src/extensions/externalize-string-extension.h"
(...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after
372 function->shared()->set_native(true); 372 function->shared()->set_native(true);
373 } 373 }
374 374
375 void InstallFunction(Handle<JSObject> target, Handle<JSFunction> function, 375 void InstallFunction(Handle<JSObject> target, Handle<JSFunction> function,
376 Handle<Name> name, 376 Handle<Name> name,
377 PropertyAttributes attributes = DONT_ENUM) { 377 PropertyAttributes attributes = DONT_ENUM) {
378 Handle<String> name_string = Name::ToFunctionName(name).ToHandleChecked(); 378 Handle<String> name_string = Name::ToFunctionName(name).ToHandleChecked();
379 InstallFunction(target, name, function, name_string, attributes); 379 InstallFunction(target, name, function, name_string, attributes);
380 } 380 }
381 381
382 Handle<JSFunction> InstallGetter(Handle<JSObject> target,
383 Handle<Name> property_name,
384 Handle<JSFunction> getter,
385 PropertyAttributes attributes = DONT_ENUM) {
386 Handle<Object> setter = target->GetIsolate()->factory()->undefined_value();
387 JSObject::DefineAccessor(target, property_name, getter, setter, attributes)
388 .Check();
389 return getter;
390 }
391
382 Handle<JSFunction> CreateFunction(Isolate* isolate, Handle<String> name, 392 Handle<JSFunction> CreateFunction(Isolate* isolate, Handle<String> name,
383 InstanceType type, int instance_size, 393 InstanceType type, int instance_size,
384 MaybeHandle<JSObject> maybe_prototype, 394 MaybeHandle<JSObject> maybe_prototype,
385 Builtins::Name call, 395 Builtins::Name call,
386 bool strict_function_map = false) { 396 bool strict_function_map = false) {
387 Factory* factory = isolate->factory(); 397 Factory* factory = isolate->factory();
388 Handle<Code> call_code(isolate->builtins()->builtin(call)); 398 Handle<Code> call_code(isolate->builtins()->builtin(call));
389 Handle<JSObject> prototype; 399 Handle<JSObject> prototype;
390 static const bool kReadOnlyPrototype = false; 400 static const bool kReadOnlyPrototype = false;
391 static const bool kInstallConstructor = false; 401 static const bool kInstallConstructor = false;
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
449 } 459 }
450 460
451 Handle<JSFunction> SimpleInstallFunction(Handle<JSObject> base, 461 Handle<JSFunction> SimpleInstallFunction(Handle<JSObject> base,
452 const char* name, Builtins::Name call, 462 const char* name, Builtins::Name call,
453 int len, bool adapt) { 463 int len, bool adapt) {
454 Factory* const factory = base->GetIsolate()->factory(); 464 Factory* const factory = base->GetIsolate()->factory();
455 return SimpleInstallFunction(base, factory->InternalizeUtf8String(name), call, 465 return SimpleInstallFunction(base, factory->InternalizeUtf8String(name), call,
456 len, adapt); 466 len, adapt);
457 } 467 }
458 468
469 Handle<JSFunction> SimpleInstallGetter(Handle<JSObject> base,
470 Handle<String> name, Builtins::Name call,
471 bool adapt) {
472 Isolate* const isolate = base->GetIsolate();
473 Handle<String> fun_name =
474 Name::ToFunctionName(name, isolate->factory()->get_string())
475 .ToHandleChecked();
476 Handle<JSFunction> fun =
477 SimpleCreateFunction(isolate, fun_name, call, 0, adapt);
478 InstallGetter(base, name, fun);
479 return fun;
480 }
481
482 Handle<JSFunction> SimpleInstallGetter(Handle<JSObject> base,
483 Handle<String> name, Builtins::Name call,
484 bool adapt, BuiltinFunctionId id) {
485 Handle<JSFunction> fun = SimpleInstallGetter(base, name, call, adapt);
486 fun->shared()->set_builtin_function_id(id);
487 return fun;
488 }
489
459 } // namespace 490 } // namespace
460 491
461 void Genesis::SetFunctionInstanceDescriptor(Handle<Map> map, 492 void Genesis::SetFunctionInstanceDescriptor(Handle<Map> map,
462 FunctionMode function_mode) { 493 FunctionMode function_mode) {
463 int size = IsFunctionModeWithPrototype(function_mode) ? 5 : 4; 494 int size = IsFunctionModeWithPrototype(function_mode) ? 5 : 4;
464 Map::EnsureDescriptorSlack(map, size); 495 Map::EnsureDescriptorSlack(map, size);
465 496
466 PropertyAttributes ro_attribs = 497 PropertyAttributes ro_attribs =
467 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); 498 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY);
468 PropertyAttributes roc_attribs = 499 PropertyAttributes roc_attribs =
(...skipping 1178 matching lines...) Expand 10 before | Expand all | Expand 10 after
1647 SimpleInstallFunction(math, "trunc", Builtins::kMathTrunc, 1, true); 1678 SimpleInstallFunction(math, "trunc", Builtins::kMathTrunc, 1, true);
1648 } 1679 }
1649 1680
1650 { // -- A r r a y B u f f e r 1681 { // -- A r r a y B u f f e r
1651 Handle<JSFunction> array_buffer_fun = 1682 Handle<JSFunction> array_buffer_fun =
1652 InstallArrayBuffer(global, "ArrayBuffer"); 1683 InstallArrayBuffer(global, "ArrayBuffer");
1653 InstallWithIntrinsicDefaultProto(isolate, array_buffer_fun, 1684 InstallWithIntrinsicDefaultProto(isolate, array_buffer_fun,
1654 Context::ARRAY_BUFFER_FUN_INDEX); 1685 Context::ARRAY_BUFFER_FUN_INDEX);
1655 } 1686 }
1656 1687
1688 { // -- T y p e d A r r a y
1689 Handle<JSObject> prototype =
1690 factory->NewJSObject(isolate->object_function(), TENURED);
1691 native_context()->set_typed_array_prototype(*prototype);
1692
1693 Handle<JSFunction> typed_array_fun =
1694 CreateFunction(isolate, factory->InternalizeUtf8String("TypedArray"),
1695 JS_TYPED_ARRAY_TYPE, JSTypedArray::kSize, prototype,
1696 Builtins::kIllegal);
1697
1698 // Install the "constructor" property on the {prototype}.
1699 JSObject::AddProperty(prototype, factory->constructor_string(),
1700 typed_array_fun, DONT_ENUM);
1701 native_context()->set_typed_array_function(*typed_array_fun);
1702
1703 // Install the "buffer", "byteOffset", "byteLength" and "length"
1704 // getters on the {prototype}.
1705 SimpleInstallGetter(prototype, factory->buffer_string(),
1706 Builtins::kTypedArrayPrototypeBuffer, false);
1707 SimpleInstallGetter(prototype, factory->byte_length_string(),
1708 Builtins::kTypedArrayPrototypeByteLength, true,
1709 kTypedArrayByteLength);
1710 SimpleInstallGetter(prototype, factory->byte_offset_string(),
1711 Builtins::kTypedArrayPrototypeByteOffset, true,
1712 kTypedArrayByteOffset);
1713 SimpleInstallGetter(prototype, factory->length_string(),
1714 Builtins::kTypedArrayPrototypeLength, true,
1715 kTypedArrayLength);
1716 }
1717
1657 { // -- T y p e d A r r a y s 1718 { // -- T y p e d A r r a y s
1658 #define INSTALL_TYPED_ARRAY(Type, type, TYPE, ctype, size) \ 1719 #define INSTALL_TYPED_ARRAY(Type, type, TYPE, ctype, size) \
1659 { \ 1720 { \
1660 Handle<JSFunction> fun; \ 1721 Handle<JSFunction> fun; \
1661 InstallTypedArray(#Type "Array", TYPE##_ELEMENTS, &fun); \ 1722 InstallTypedArray(#Type "Array", TYPE##_ELEMENTS, &fun); \
1662 InstallWithIntrinsicDefaultProto(isolate, fun, \ 1723 InstallWithIntrinsicDefaultProto(isolate, fun, \
1663 Context::TYPE##_ARRAY_FUN_INDEX); \ 1724 Context::TYPE##_ARRAY_FUN_INDEX); \
1664 } 1725 }
1665 TYPED_ARRAYS(INSTALL_TYPED_ARRAY) 1726 TYPED_ARRAYS(INSTALL_TYPED_ARRAY)
1666 #undef INSTALL_TYPED_ARRAY 1727 #undef INSTALL_TYPED_ARRAY
1728 }
1667 1729
1668 Handle<JSFunction> data_view_fun = InstallFunction( 1730 { // -- D a t a V i e w
1669 global, "DataView", JS_DATA_VIEW_TYPE, 1731 Handle<JSObject> prototype =
1670 JSDataView::kSizeWithInternalFields, 1732 factory->NewJSObject(isolate->object_function(), TENURED);
1671 isolate->initial_object_prototype(), Builtins::kDataViewConstructor); 1733 Handle<JSFunction> data_view_fun =
1734 InstallFunction(global, "DataView", JS_DATA_VIEW_TYPE,
1735 JSDataView::kSizeWithInternalFields, prototype,
1736 Builtins::kDataViewConstructor);
1672 InstallWithIntrinsicDefaultProto(isolate, data_view_fun, 1737 InstallWithIntrinsicDefaultProto(isolate, data_view_fun,
1673 Context::DATA_VIEW_FUN_INDEX); 1738 Context::DATA_VIEW_FUN_INDEX);
1674 data_view_fun->shared()->set_construct_stub( 1739 data_view_fun->shared()->set_construct_stub(
1675 *isolate->builtins()->DataViewConstructor_ConstructStub()); 1740 *isolate->builtins()->DataViewConstructor_ConstructStub());
1676 data_view_fun->shared()->set_length(3); 1741 data_view_fun->shared()->set_length(3);
1677 data_view_fun->shared()->DontAdaptArguments(); 1742 data_view_fun->shared()->DontAdaptArguments();
1743
1744 // Install the @@toStringTag property on the {prototype}.
1745 JSObject::AddProperty(
1746 prototype, factory->to_string_tag_symbol(),
1747 factory->NewStringFromAsciiChecked("DataView"),
1748 static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
1749
1750 // Install the "constructor" property on the {prototype}.
1751 JSObject::AddProperty(prototype, factory->constructor_string(),
1752 data_view_fun, DONT_ENUM);
1753
1754 // Install the "buffer", "byteOffset" and "byteLength" getters
1755 // on the {prototype}.
1756 SimpleInstallGetter(prototype, factory->buffer_string(),
1757 Builtins::kDataViewPrototypeGetBuffer, false,
1758 kDataViewBuffer);
1759 SimpleInstallGetter(prototype, factory->byte_length_string(),
1760 Builtins::kDataViewPrototypeGetByteLength, false,
1761 kDataViewByteLength);
1762 SimpleInstallGetter(prototype, factory->byte_offset_string(),
1763 Builtins::kDataViewPrototypeGetByteOffset, false,
1764 kDataViewByteOffset);
1678 } 1765 }
1679 1766
1680 { // -- M a p 1767 { // -- M a p
1681 Handle<JSFunction> js_map_fun = InstallFunction( 1768 Handle<JSFunction> js_map_fun = InstallFunction(
1682 global, "Map", JS_MAP_TYPE, JSMap::kSize, 1769 global, "Map", JS_MAP_TYPE, JSMap::kSize,
1683 isolate->initial_object_prototype(), Builtins::kIllegal); 1770 isolate->initial_object_prototype(), Builtins::kIllegal);
1684 InstallWithIntrinsicDefaultProto(isolate, js_map_fun, 1771 InstallWithIntrinsicDefaultProto(isolate, js_map_fun,
1685 Context::JS_MAP_FUN_INDEX); 1772 Context::JS_MAP_FUN_INDEX);
1686 } 1773 }
1687 1774
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after
1966 { 2053 {
1967 // Set up the call-as-constructor delegate. 2054 // Set up the call-as-constructor delegate.
1968 Handle<Code> code = isolate->builtins()->HandleApiCallAsConstructor(); 2055 Handle<Code> code = isolate->builtins()->HandleApiCallAsConstructor();
1969 Handle<JSFunction> delegate = factory->NewFunction( 2056 Handle<JSFunction> delegate = factory->NewFunction(
1970 factory->empty_string(), code, JS_OBJECT_TYPE, JSObject::kHeaderSize); 2057 factory->empty_string(), code, JS_OBJECT_TYPE, JSObject::kHeaderSize);
1971 native_context()->set_call_as_constructor_delegate(*delegate); 2058 native_context()->set_call_as_constructor_delegate(*delegate);
1972 delegate->shared()->DontAdaptArguments(); 2059 delegate->shared()->DontAdaptArguments();
1973 } 2060 }
1974 } // NOLINT(readability/fn_size) 2061 } // NOLINT(readability/fn_size)
1975 2062
1976
1977 void Genesis::InstallTypedArray(const char* name, ElementsKind elements_kind, 2063 void Genesis::InstallTypedArray(const char* name, ElementsKind elements_kind,
1978 Handle<JSFunction>* fun) { 2064 Handle<JSFunction>* fun) {
1979 Handle<JSObject> global = Handle<JSObject>(native_context()->global_object()); 2065 Handle<JSObject> global = Handle<JSObject>(native_context()->global_object());
1980 Handle<JSFunction> result = InstallFunction( 2066
1981 global, name, JS_TYPED_ARRAY_TYPE, JSTypedArray::kSize, 2067 Handle<JSObject> typed_array_prototype =
1982 isolate()->initial_object_prototype(), Builtins::kIllegal); 2068 Handle<JSObject>(isolate()->typed_array_prototype());
2069 Handle<JSFunction> typed_array_function =
2070 Handle<JSFunction>(isolate()->typed_array_function());
2071
2072 Handle<JSObject> prototype =
2073 factory()->NewJSObject(isolate()->object_function(), TENURED);
2074 Handle<JSFunction> result =
2075 InstallFunction(global, name, JS_TYPED_ARRAY_TYPE, JSTypedArray::kSize,
2076 prototype, Builtins::kIllegal);
1983 2077
1984 Handle<Map> initial_map = isolate()->factory()->NewMap( 2078 Handle<Map> initial_map = isolate()->factory()->NewMap(
1985 JS_TYPED_ARRAY_TYPE, 2079 JS_TYPED_ARRAY_TYPE,
1986 JSTypedArray::kSizeWithInternalFields, 2080 JSTypedArray::kSizeWithInternalFields,
1987 elements_kind); 2081 elements_kind);
1988 JSFunction::SetInitialMap(result, initial_map, 2082 JSFunction::SetInitialMap(result, initial_map,
1989 handle(initial_map->prototype(), isolate())); 2083 handle(initial_map->prototype(), isolate()));
2084
2085 CHECK(JSObject::SetPrototype(result, typed_array_function, false,
2086 Object::DONT_THROW)
2087 .FromJust());
2088
2089 CHECK(JSObject::SetPrototype(prototype, typed_array_prototype, false,
2090 Object::DONT_THROW)
2091 .FromJust());
1990 *fun = result; 2092 *fun = result;
1991 } 2093 }
1992 2094
1993 2095
1994 void Genesis::InitializeExperimentalGlobal() { 2096 void Genesis::InitializeExperimentalGlobal() {
1995 #define FEATURE_INITIALIZE_GLOBAL(id, descr) InitializeGlobal_##id(); 2097 #define FEATURE_INITIALIZE_GLOBAL(id, descr) InitializeGlobal_##id();
1996 2098
1997 HARMONY_INPROGRESS(FEATURE_INITIALIZE_GLOBAL) 2099 HARMONY_INPROGRESS(FEATURE_INITIALIZE_GLOBAL)
1998 HARMONY_STAGED(FEATURE_INITIALIZE_GLOBAL) 2100 HARMONY_STAGED(FEATURE_INITIALIZE_GLOBAL)
1999 HARMONY_SHIPPING(FEATURE_INITIALIZE_GLOBAL) 2101 HARMONY_SHIPPING(FEATURE_INITIALIZE_GLOBAL)
(...skipping 1817 matching lines...) Expand 10 before | Expand all | Expand 10 after
3817 } 3919 }
3818 3920
3819 3921
3820 // Called when the top-level V8 mutex is destroyed. 3922 // Called when the top-level V8 mutex is destroyed.
3821 void Bootstrapper::FreeThreadResources() { 3923 void Bootstrapper::FreeThreadResources() {
3822 DCHECK(!IsActive()); 3924 DCHECK(!IsActive());
3823 } 3925 }
3824 3926
3825 } // namespace internal 3927 } // namespace internal
3826 } // namespace v8 3928 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | src/builtins.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698