From b0f91095bdbea79a08577b88ccacd711e5c154cf Mon Sep 17 00:00:00 2001 From: "dslomov@chromium.org" Date: Tue, 22 Apr 2014 12:24:28 +0000 Subject: [PATCH] Cache maps for externalized typed array objects. After this, the maps do not garbage-collect, and typed array constructors do not deopt. R=ulan@chromium.org BUG=363855 LOG=N Review URL: https://codereview.chromium.org/247343002 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@20887 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- include/v8.h | 2 +- src/bootstrapper.cc | 32 ++++++++++++++++++++++++-------- src/contexts.h | 19 +++++++++++++++++++ 3 files changed, 44 insertions(+), 9 deletions(-) diff --git a/include/v8.h b/include/v8.h index 7e41ee8..1289730 100644 --- a/include/v8.h +++ b/include/v8.h @@ -5533,7 +5533,7 @@ class Internals { static const int kJSObjectHeaderSize = 3 * kApiPointerSize; static const int kFixedArrayHeaderSize = 2 * kApiPointerSize; static const int kContextHeaderSize = 2 * kApiPointerSize; - static const int kContextEmbedderDataIndex = 65; + static const int kContextEmbedderDataIndex = 74; static const int kFullStringRepresentationMask = 0x07; static const int kStringEncodingMask = 0x4; static const int kExternalTwoByteRepresentationTag = 0x02; diff --git a/src/bootstrapper.cc b/src/bootstrapper.cc index edef616..6c6e6b3 100644 --- a/src/bootstrapper.cc +++ b/src/bootstrapper.cc @@ -207,8 +207,11 @@ class Genesis BASE_EMBEDDED { ElementsKind elements_kind); bool InstallNatives(); - Handle InstallTypedArray(const char* name, - ElementsKind elementsKind); + void InstallTypedArray( + const char* name, + ElementsKind elements_kind, + Handle* fun, + Handle* external_map); bool InstallExperimentalNatives(); void InstallBuiltinFunctionIds(); void InstallJSFunctionResultCaches(); @@ -1039,9 +1042,14 @@ void Genesis::InitializeGlobal(Handle inner_global, { // -- T y p e d A r r a y s #define INSTALL_TYPED_ARRAY(Type, type, TYPE, ctype, size) \ { \ - Handle fun = InstallTypedArray(#Type "Array", \ - TYPE##_ELEMENTS); \ + Handle fun; \ + Handle external_map; \ + InstallTypedArray(#Type "Array", \ + TYPE##_ELEMENTS, \ + &fun, \ + &external_map); \ native_context()->set_##type##_array_fun(*fun); \ + native_context()->set_##type##_array_external_map(*external_map); \ } TYPED_ARRAYS(INSTALL_TYPED_ARRAY) #undef INSTALL_TYPED_ARRAY @@ -1252,18 +1260,26 @@ void Genesis::InitializeGlobal(Handle inner_global, } -Handle Genesis::InstallTypedArray( - const char* name, ElementsKind elementsKind) { +void Genesis::InstallTypedArray( + const char* name, + ElementsKind elements_kind, + Handle* fun, + Handle* external_map) { Handle global = Handle(native_context()->global_object()); Handle result = InstallFunction(global, name, JS_TYPED_ARRAY_TYPE, JSTypedArray::kSize, isolate()->initial_object_prototype(), Builtins::kIllegal, false, true); Handle initial_map = isolate()->factory()->NewMap( - JS_TYPED_ARRAY_TYPE, JSTypedArray::kSizeWithInternalFields, elementsKind); + JS_TYPED_ARRAY_TYPE, + JSTypedArray::kSizeWithInternalFields, + elements_kind); result->set_initial_map(*initial_map); initial_map->set_constructor(*result); - return result; + *fun = result; + + ElementsKind external_kind = GetNextTransitionElementsKind(elements_kind); + *external_map = Map::AsElementsKind(initial_map, external_kind); } diff --git a/src/contexts.h b/src/contexts.h index 7bb6eb4..9cd9ffa 100644 --- a/src/contexts.h +++ b/src/contexts.h @@ -134,6 +134,16 @@ enum BindingFlags { V(FLOAT32_ARRAY_FUN_INDEX, JSFunction, float32_array_fun) \ V(FLOAT64_ARRAY_FUN_INDEX, JSFunction, float64_array_fun) \ V(UINT8_CLAMPED_ARRAY_FUN_INDEX, JSFunction, uint8_clamped_array_fun) \ + V(INT8_ARRAY_EXTERNAL_MAP_INDEX, Map, int8_array_external_map) \ + V(UINT8_ARRAY_EXTERNAL_MAP_INDEX, Map, uint8_array_external_map) \ + V(INT16_ARRAY_EXTERNAL_MAP_INDEX, Map, int16_array_external_map) \ + V(UINT16_ARRAY_EXTERNAL_MAP_INDEX, Map, uint16_array_external_map) \ + V(INT32_ARRAY_EXTERNAL_MAP_INDEX, Map, int32_array_external_map) \ + V(UINT32_ARRAY_EXTERNAL_MAP_INDEX, Map, uint32_array_external_map) \ + V(FLOAT32_ARRAY_EXTERNAL_MAP_INDEX, Map, float32_array_external_map) \ + V(FLOAT64_ARRAY_EXTERNAL_MAP_INDEX, Map, float64_array_external_map) \ + V(UINT8_CLAMPED_ARRAY_EXTERNAL_MAP_INDEX, Map, \ + uint8_clamped_array_external_map) \ V(DATA_VIEW_FUN_INDEX, JSFunction, data_view_fun) \ V(SLOPPY_FUNCTION_MAP_INDEX, Map, sloppy_function_map) \ V(STRICT_FUNCTION_MAP_INDEX, Map, strict_function_map) \ @@ -311,6 +321,15 @@ class Context: public FixedArray { FLOAT32_ARRAY_FUN_INDEX, FLOAT64_ARRAY_FUN_INDEX, UINT8_CLAMPED_ARRAY_FUN_INDEX, + INT8_ARRAY_EXTERNAL_MAP_INDEX, + UINT8_ARRAY_EXTERNAL_MAP_INDEX, + INT16_ARRAY_EXTERNAL_MAP_INDEX, + UINT16_ARRAY_EXTERNAL_MAP_INDEX, + INT32_ARRAY_EXTERNAL_MAP_INDEX, + UINT32_ARRAY_EXTERNAL_MAP_INDEX, + FLOAT32_ARRAY_EXTERNAL_MAP_INDEX, + FLOAT64_ARRAY_EXTERNAL_MAP_INDEX, + UINT8_CLAMPED_ARRAY_EXTERNAL_MAP_INDEX, DATA_VIEW_FUN_INDEX, MESSAGE_LISTENERS_INDEX, MAKE_MESSAGE_FUN_INDEX, -- 2.7.4