| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index ce590c7e33ecf957b7682b102e62cfde460f3d03..b2b00e665c7c9b0efcf34abec9c76fc4d3b014ae 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -4556,19 +4556,16 @@ Handle<Map> Map::TransitionElementsTo(Handle<Map> map,
|
| DCHECK_EQ(FAST_SLOPPY_ARGUMENTS_ELEMENTS, to_kind);
|
| return handle(native_context->fast_aliased_arguments_map());
|
| }
|
| - } else {
|
| - Object* maybe_array_maps = map->is_strong()
|
| - ? native_context->js_array_strong_maps()
|
| - : native_context->js_array_maps();
|
| + } else if (IsFastElementsKind(from_kind) && IsFastElementsKind(to_kind)) {
|
| // Reuse map transitions for JSArrays.
|
| - if (maybe_array_maps->IsFixedArray()) {
|
| - DisallowHeapAllocation no_gc;
|
| - FixedArray* array_maps = FixedArray::cast(maybe_array_maps);
|
| - if (array_maps->get(from_kind) == *map) {
|
| - Object* maybe_transitioned_map = array_maps->get(to_kind);
|
| - if (maybe_transitioned_map->IsMap()) {
|
| - return handle(Map::cast(maybe_transitioned_map));
|
| - }
|
| + DisallowHeapAllocation no_gc;
|
| + Strength strength = map->is_strong() ? Strength::STRONG : Strength::WEAK;
|
| + if (native_context->get(Context::ArrayMapIndex(from_kind, strength)) ==
|
| + *map) {
|
| + Object* maybe_transitioned_map =
|
| + native_context->get(Context::ArrayMapIndex(to_kind, strength));
|
| + if (maybe_transitioned_map->IsMap()) {
|
| + return handle(Map::cast(maybe_transitioned_map), isolate);
|
| }
|
| }
|
| }
|
| @@ -12526,33 +12523,26 @@ Handle<Object> CacheInitialJSArrayMaps(
|
| Handle<Context> native_context, Handle<Map> initial_map) {
|
| // Replace all of the cached initial array maps in the native context with
|
| // the appropriate transitioned elements kind maps.
|
| - Factory* factory = native_context->GetIsolate()->factory();
|
| - Handle<FixedArray> maps = factory->NewFixedArrayWithHoles(
|
| - kElementsKindCount, TENURED);
|
| -
|
| + Strength strength =
|
| + initial_map->is_strong() ? Strength::STRONG : Strength::WEAK;
|
| Handle<Map> current_map = initial_map;
|
| ElementsKind kind = current_map->elements_kind();
|
| - DCHECK(kind == GetInitialFastElementsKind());
|
| - maps->set(kind, *current_map);
|
| + DCHECK_EQ(GetInitialFastElementsKind(), kind);
|
| + native_context->set(Context::ArrayMapIndex(kind, strength), *current_map);
|
| for (int i = GetSequenceIndexFromFastElementsKind(kind) + 1;
|
| i < kFastElementsKindCount; ++i) {
|
| Handle<Map> new_map;
|
| ElementsKind next_kind = GetFastElementsKindFromSequenceIndex(i);
|
| - Map* maybe_elements_transition = current_map->ElementsTransitionMap();
|
| - if (maybe_elements_transition != NULL) {
|
| + if (Map* maybe_elements_transition = current_map->ElementsTransitionMap()) {
|
| new_map = handle(maybe_elements_transition);
|
| - DCHECK(new_map->elements_kind() == next_kind);
|
| } else {
|
| new_map = Map::CopyAsElementsKind(
|
| current_map, next_kind, INSERT_TRANSITION);
|
| }
|
| - maps->set(next_kind, *new_map);
|
| + DCHECK_EQ(next_kind, new_map->elements_kind());
|
| + native_context->set(Context::ArrayMapIndex(next_kind, strength), *new_map);
|
| current_map = new_map;
|
| }
|
| - if (initial_map->is_strong())
|
| - native_context->set_js_array_strong_maps(*maps);
|
| - else
|
| - native_context->set_js_array_maps(*maps);
|
| return initial_map;
|
| }
|
|
|
|
|