Commit b0f91095 authored by dslomov@chromium.org's avatar dslomov@chromium.org

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
parent a2ac40ac
...@@ -5533,7 +5533,7 @@ class Internals { ...@@ -5533,7 +5533,7 @@ class Internals {
static const int kJSObjectHeaderSize = 3 * kApiPointerSize; static const int kJSObjectHeaderSize = 3 * kApiPointerSize;
static const int kFixedArrayHeaderSize = 2 * kApiPointerSize; static const int kFixedArrayHeaderSize = 2 * kApiPointerSize;
static const int kContextHeaderSize = 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 kFullStringRepresentationMask = 0x07;
static const int kStringEncodingMask = 0x4; static const int kStringEncodingMask = 0x4;
static const int kExternalTwoByteRepresentationTag = 0x02; static const int kExternalTwoByteRepresentationTag = 0x02;
......
...@@ -207,8 +207,11 @@ class Genesis BASE_EMBEDDED { ...@@ -207,8 +207,11 @@ class Genesis BASE_EMBEDDED {
ElementsKind elements_kind); ElementsKind elements_kind);
bool InstallNatives(); bool InstallNatives();
Handle<JSFunction> InstallTypedArray(const char* name, void InstallTypedArray(
ElementsKind elementsKind); const char* name,
ElementsKind elements_kind,
Handle<JSFunction>* fun,
Handle<Map>* external_map);
bool InstallExperimentalNatives(); bool InstallExperimentalNatives();
void InstallBuiltinFunctionIds(); void InstallBuiltinFunctionIds();
void InstallJSFunctionResultCaches(); void InstallJSFunctionResultCaches();
...@@ -1039,9 +1042,14 @@ void Genesis::InitializeGlobal(Handle<GlobalObject> inner_global, ...@@ -1039,9 +1042,14 @@ void Genesis::InitializeGlobal(Handle<GlobalObject> inner_global,
{ // -- T y p e d A r r a y s { // -- T y p e d A r r a y s
#define INSTALL_TYPED_ARRAY(Type, type, TYPE, ctype, size) \ #define INSTALL_TYPED_ARRAY(Type, type, TYPE, ctype, size) \
{ \ { \
Handle<JSFunction> fun = InstallTypedArray(#Type "Array", \ Handle<JSFunction> fun; \
TYPE##_ELEMENTS); \ Handle<Map> external_map; \
InstallTypedArray(#Type "Array", \
TYPE##_ELEMENTS, \
&fun, \
&external_map); \
native_context()->set_##type##_array_fun(*fun); \ native_context()->set_##type##_array_fun(*fun); \
native_context()->set_##type##_array_external_map(*external_map); \
} }
TYPED_ARRAYS(INSTALL_TYPED_ARRAY) TYPED_ARRAYS(INSTALL_TYPED_ARRAY)
#undef INSTALL_TYPED_ARRAY #undef INSTALL_TYPED_ARRAY
...@@ -1252,18 +1260,26 @@ void Genesis::InitializeGlobal(Handle<GlobalObject> inner_global, ...@@ -1252,18 +1260,26 @@ void Genesis::InitializeGlobal(Handle<GlobalObject> inner_global,
} }
Handle<JSFunction> Genesis::InstallTypedArray( void Genesis::InstallTypedArray(
const char* name, ElementsKind elementsKind) { const char* name,
ElementsKind elements_kind,
Handle<JSFunction>* fun,
Handle<Map>* external_map) {
Handle<JSObject> global = Handle<JSObject>(native_context()->global_object()); Handle<JSObject> global = Handle<JSObject>(native_context()->global_object());
Handle<JSFunction> result = InstallFunction(global, name, JS_TYPED_ARRAY_TYPE, Handle<JSFunction> result = InstallFunction(global, name, JS_TYPED_ARRAY_TYPE,
JSTypedArray::kSize, isolate()->initial_object_prototype(), JSTypedArray::kSize, isolate()->initial_object_prototype(),
Builtins::kIllegal, false, true); Builtins::kIllegal, false, true);
Handle<Map> initial_map = isolate()->factory()->NewMap( Handle<Map> 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); result->set_initial_map(*initial_map);
initial_map->set_constructor(*result); initial_map->set_constructor(*result);
return result; *fun = result;
ElementsKind external_kind = GetNextTransitionElementsKind(elements_kind);
*external_map = Map::AsElementsKind(initial_map, external_kind);
} }
......
...@@ -134,6 +134,16 @@ enum BindingFlags { ...@@ -134,6 +134,16 @@ enum BindingFlags {
V(FLOAT32_ARRAY_FUN_INDEX, JSFunction, float32_array_fun) \ V(FLOAT32_ARRAY_FUN_INDEX, JSFunction, float32_array_fun) \
V(FLOAT64_ARRAY_FUN_INDEX, JSFunction, float64_array_fun) \ V(FLOAT64_ARRAY_FUN_INDEX, JSFunction, float64_array_fun) \
V(UINT8_CLAMPED_ARRAY_FUN_INDEX, JSFunction, uint8_clamped_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(DATA_VIEW_FUN_INDEX, JSFunction, data_view_fun) \
V(SLOPPY_FUNCTION_MAP_INDEX, Map, sloppy_function_map) \ V(SLOPPY_FUNCTION_MAP_INDEX, Map, sloppy_function_map) \
V(STRICT_FUNCTION_MAP_INDEX, Map, strict_function_map) \ V(STRICT_FUNCTION_MAP_INDEX, Map, strict_function_map) \
...@@ -311,6 +321,15 @@ class Context: public FixedArray { ...@@ -311,6 +321,15 @@ class Context: public FixedArray {
FLOAT32_ARRAY_FUN_INDEX, FLOAT32_ARRAY_FUN_INDEX,
FLOAT64_ARRAY_FUN_INDEX, FLOAT64_ARRAY_FUN_INDEX,
UINT8_CLAMPED_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, DATA_VIEW_FUN_INDEX,
MESSAGE_LISTENERS_INDEX, MESSAGE_LISTENERS_INDEX,
MAKE_MESSAGE_FUN_INDEX, MAKE_MESSAGE_FUN_INDEX,
......
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