Chromium Code Reviews| Index: src/ic/ic.cc |
| diff --git a/src/ic/ic.cc b/src/ic/ic.cc |
| index 8b3859487078144b36af65050579e97dce72754e..4e4d4344e1863a0453a340860336303ccb975c7b 100644 |
| --- a/src/ic/ic.cc |
| +++ b/src/ic/ic.cc |
| @@ -549,7 +549,7 @@ void IC::ConfigureVectorState(Handle<Name> name, Handle<Map> map, |
| OnFeedbackChanged(isolate(), GetHostFunction()); |
| } |
| -void IC::ConfigureVectorState(Handle<Name> name, MapHandleList* maps, |
| +void IC::ConfigureVectorState(Handle<Name> name, MapHandles const& maps, |
| List<Handle<Object>>* handlers) { |
| DCHECK(!IsLoadGlobalIC()); |
| // Non-keyed ICs don't track the name explicitly. |
| @@ -636,16 +636,15 @@ MaybeHandle<Object> LoadGlobalIC::Load(Handle<Name> name) { |
| return LoadIC::Load(global, name); |
| } |
| -static bool AddOneReceiverMapIfMissing(MapHandleList* receiver_maps, |
| +static bool AddOneReceiverMapIfMissing(MapHandles* receiver_maps, |
| Handle<Map> new_receiver_map) { |
| DCHECK(!new_receiver_map.is_null()); |
| - for (int current = 0; current < receiver_maps->length(); ++current) { |
| - if (!receiver_maps->at(current).is_null() && |
| - receiver_maps->at(current).is_identical_to(new_receiver_map)) { |
| + for (auto map : *receiver_maps) { |
| + if (!map.is_null() && map.is_identical_to(new_receiver_map)) { |
| return false; |
| } |
| } |
| - receiver_maps->Add(new_receiver_map); |
| + receiver_maps->push_back(new_receiver_map); |
| return true; |
| } |
| @@ -653,11 +652,11 @@ bool IC::UpdatePolymorphicIC(Handle<Name> name, Handle<Object> handler) { |
| DCHECK(IsHandler(*handler)); |
| if (is_keyed() && state() != RECOMPUTE_HANDLER) return false; |
| Handle<Map> map = receiver_map(); |
| - MapHandleList maps; |
| + MapHandles maps; |
| List<Handle<Object>> handlers; |
| TargetMaps(&maps); |
| - int number_of_maps = maps.length(); |
| + int number_of_maps = static_cast<int>(maps.size()); |
| int deprecated_maps = 0; |
| int handler_to_overwrite = -1; |
| @@ -684,7 +683,8 @@ bool IC::UpdatePolymorphicIC(Handle<Name> name, Handle<Object> handler) { |
| if (number_of_maps == 0 && state() != MONOMORPHIC && state() != POLYMORPHIC) { |
| return false; |
| } |
| - if (!nexus()->FindHandlers(&handlers, maps.length())) return false; |
| + if (!nexus()->FindHandlers(&handlers, static_cast<int>(maps.size()))) |
| + return false; |
| number_of_valid_maps++; |
| if (number_of_valid_maps > 1 && is_keyed()) return false; |
| @@ -694,14 +694,14 @@ bool IC::UpdatePolymorphicIC(Handle<Name> name, Handle<Object> handler) { |
| if (handler_to_overwrite >= 0) { |
| handlers.Set(handler_to_overwrite, handler); |
| if (!map.is_identical_to(maps.at(handler_to_overwrite))) { |
| - maps.Set(handler_to_overwrite, map); |
| + maps[handler_to_overwrite] = map; |
| } |
| } else { |
| - maps.Add(map); |
| + maps.push_back(map); |
| handlers.Add(handler); |
| } |
| - ConfigureVectorState(name, &maps, &handlers); |
| + ConfigureVectorState(name, maps, &handlers); |
| } |
| return true; |
| @@ -714,11 +714,11 @@ void IC::UpdateMonomorphicIC(Handle<Object> handler, Handle<Name> name) { |
| void IC::CopyICToMegamorphicCache(Handle<Name> name) { |
| - MapHandleList maps; |
| + MapHandles maps; |
| List<Handle<Object>> handlers; |
| TargetMaps(&maps); |
| - if (!nexus()->FindHandlers(&handlers, maps.length())) return; |
| - for (int i = 0; i < maps.length(); i++) { |
| + if (!nexus()->FindHandlers(&handlers, static_cast<int>(maps.size()))) return; |
| + for (int i = 0; i < static_cast<int>(maps.size()); i++) { |
| UpdateMegamorphicCache(*maps.at(i), *name, *handlers.at(i)); |
| } |
| } |
| @@ -732,9 +732,9 @@ bool IC::IsTransitionOfMonomorphicTarget(Map* source_map, Map* target_map) { |
| source_map->elements_kind(), target_elements_kind); |
| Map* transitioned_map = nullptr; |
| if (more_general_transition) { |
| - MapHandleList map_list; |
| - map_list.Add(handle(target_map)); |
| - transitioned_map = source_map->FindElementsKindTransitionedMap(&map_list); |
| + MapHandles map_list; |
| + map_list.push_back(handle(target_map)); |
| + transitioned_map = source_map->FindElementsKindTransitionedMap(map_list); |
| } |
| return transitioned_map == target_map; |
| } |
| @@ -1316,16 +1316,15 @@ void KeyedLoadIC::UpdateLoadElement(Handle<HeapObject> receiver) { |
| Handle<Map> receiver_map(receiver->map(), isolate()); |
| DCHECK(receiver_map->instance_type() != JS_VALUE_TYPE && |
| receiver_map->instance_type() != JS_PROXY_TYPE); // Checked by caller. |
| - MapHandleList target_receiver_maps; |
| + MapHandles target_receiver_maps; |
| TargetMaps(&target_receiver_maps); |
| - if (target_receiver_maps.length() == 0) { |
| + if (target_receiver_maps.empty()) { |
| Handle<Object> handler = LoadElementHandler(receiver_map); |
| return ConfigureVectorState(Handle<Name>(), receiver_map, handler); |
| } |
| - for (int i = 0; i < target_receiver_maps.length(); i++) { |
| - Handle<Map> map = target_receiver_maps.at(i); |
| + for (auto map : target_receiver_maps) { |
| if (map.is_null()) continue; |
| if (map->instance_type() == JS_VALUE_TYPE) { |
| TRACE_GENERIC_IC("JSValue"); |
| @@ -1365,19 +1364,19 @@ void KeyedLoadIC::UpdateLoadElement(Handle<HeapObject> receiver) { |
| // If the maximum number of receiver maps has been exceeded, use the generic |
| // version of the IC. |
| - if (target_receiver_maps.length() > kMaxKeyedPolymorphism) { |
| + if (target_receiver_maps.size() > kMaxKeyedPolymorphism) { |
| TRACE_GENERIC_IC("max polymorph exceeded"); |
| return; |
| } |
| - List<Handle<Object>> handlers(target_receiver_maps.length()); |
| + List<Handle<Object>> handlers(static_cast<int>(target_receiver_maps.size())); |
| LoadElementPolymorphicHandlers(&target_receiver_maps, &handlers); |
| - DCHECK_LE(1, target_receiver_maps.length()); |
| - if (target_receiver_maps.length() == 1) { |
| - ConfigureVectorState(Handle<Name>(), target_receiver_maps.at(0), |
| + DCHECK_LE(1, target_receiver_maps.size()); |
| + if (target_receiver_maps.size() == 1) { |
| + ConfigureVectorState(Handle<Name>(), target_receiver_maps[0], |
| handlers.at(0)); |
| } else { |
| - ConfigureVectorState(Handle<Name>(), &target_receiver_maps, &handlers); |
| + ConfigureVectorState(Handle<Name>(), target_receiver_maps, &handlers); |
| } |
| } |
| @@ -1422,12 +1421,16 @@ Handle<Object> KeyedLoadIC::LoadElementHandler(Handle<Map> receiver_map) { |
| } |
| void KeyedLoadIC::LoadElementPolymorphicHandlers( |
| - MapHandleList* receiver_maps, List<Handle<Object>>* handlers) { |
| - for (int i = 0; i < receiver_maps->length(); ++i) { |
| - Handle<Map> receiver_map(receiver_maps->at(i)); |
| + MapHandles* receiver_maps, List<Handle<Object>>* handlers) { |
| + MapHandles::iterator current_map = receiver_maps->begin(); |
| + MapHandles::iterator last_valid_map = receiver_maps->end(); |
| + while (current_map < last_valid_map) { |
| + Handle<Map> receiver_map = *current_map; |
| if (receiver_map->is_deprecated()) { |
| // Filter out deprecated maps to ensure their instances get migrated. |
| - receiver_maps->Remove(i--); |
| + --last_valid_map; |
| + std::swap(*current_map, *last_valid_map); |
| + receiver_maps->erase(last_valid_map, receiver_maps->end()); |
| continue; |
| } |
| @@ -1435,12 +1438,13 @@ void KeyedLoadIC::LoadElementPolymorphicHandlers( |
| // among receiver_maps as unstable because the optimizing compilers may |
| // generate an elements kind transition for this kind of receivers. |
| if (receiver_map->is_stable()) { |
| - Map* tmap = receiver_map->FindElementsKindTransitionedMap(receiver_maps); |
| + Map* tmap = receiver_map->FindElementsKindTransitionedMap(*receiver_maps); |
| if (tmap != nullptr) { |
| receiver_map->NotifyLeafMapLayoutChange(); |
| } |
| } |
| handlers->Add(LoadElementHandler(receiver_map)); |
| + ++current_map; |
| } |
| } |
| @@ -1918,9 +1922,9 @@ Handle<Code> StoreIC::CompileHandler(LookupIterator* lookup) { |
| void KeyedStoreIC::UpdateStoreElement(Handle<Map> receiver_map, |
| KeyedAccessStoreMode store_mode) { |
| - MapHandleList target_receiver_maps; |
| + MapHandles target_receiver_maps; |
| TargetMaps(&target_receiver_maps); |
| - if (target_receiver_maps.length() == 0) { |
| + if (target_receiver_maps.empty()) { |
| Handle<Map> monomorphic_map = |
| ComputeTransitionedMap(receiver_map, store_mode); |
| store_mode = GetNonTransitioningStoreMode(store_mode); |
| @@ -1928,9 +1932,8 @@ void KeyedStoreIC::UpdateStoreElement(Handle<Map> receiver_map, |
| return ConfigureVectorState(Handle<Name>(), monomorphic_map, handler); |
| } |
| - for (int i = 0; i < target_receiver_maps.length(); i++) { |
| - if (!target_receiver_maps.at(i).is_null() && |
| - target_receiver_maps.at(i)->instance_type() == JS_VALUE_TYPE) { |
| + for (auto map : target_receiver_maps) { |
| + if (!map.is_null() && map->instance_type() == JS_VALUE_TYPE) { |
| TRACE_GENERIC_IC("JSValue"); |
| return; |
| } |
| @@ -1995,7 +1998,7 @@ void KeyedStoreIC::UpdateStoreElement(Handle<Map> receiver_map, |
| // If the maximum number of receiver maps has been exceeded, use the |
| // megamorphic version of the IC. |
| - if (target_receiver_maps.length() > kMaxKeyedPolymorphism) return; |
| + if (target_receiver_maps.size() > kMaxKeyedPolymorphism) return; |
| // Make sure all polymorphic handlers have the same store mode, otherwise the |
| // megamorphic stub must be used. |
| @@ -2013,27 +2016,27 @@ void KeyedStoreIC::UpdateStoreElement(Handle<Map> receiver_map, |
| // receivers are either external arrays, or all "normal" arrays. Otherwise, |
| // use the megamorphic stub. |
| if (store_mode != STANDARD_STORE) { |
| - int external_arrays = 0; |
| - for (int i = 0; i < target_receiver_maps.length(); ++i) { |
| - if (target_receiver_maps[i]->has_fixed_typed_array_elements()) { |
| + size_t external_arrays = 0; |
| + for (auto map : target_receiver_maps) { |
| + if (map->has_fixed_typed_array_elements()) { |
| external_arrays++; |
| } |
| } |
| if (external_arrays != 0 && |
| - external_arrays != target_receiver_maps.length()) { |
| + external_arrays != target_receiver_maps.size()) { |
| TRACE_GENERIC_IC("unsupported combination of external and normal arrays"); |
| return; |
| } |
| } |
| - List<Handle<Object>> handlers(target_receiver_maps.length()); |
| + List<Handle<Object>> handlers(static_cast<int>(target_receiver_maps.size())); |
| StoreElementPolymorphicHandlers(&target_receiver_maps, &handlers, store_mode); |
| - DCHECK_LE(1, target_receiver_maps.length()); |
| - if (target_receiver_maps.length() == 1) { |
| - ConfigureVectorState(Handle<Name>(), target_receiver_maps.at(0), |
| + DCHECK_LE(1, target_receiver_maps.size()); |
| + if (target_receiver_maps.size() == 1) { |
| + ConfigureVectorState(Handle<Name>(), target_receiver_maps[0], |
| handlers.at(0)); |
| } else { |
| - ConfigureVectorState(Handle<Name>(), &target_receiver_maps, &handlers); |
| + ConfigureVectorState(Handle<Name>(), target_receiver_maps, &handlers); |
| } |
| } |
| @@ -2099,18 +2102,22 @@ Handle<Object> KeyedStoreIC::StoreElementHandler( |
| } |
| void KeyedStoreIC::StoreElementPolymorphicHandlers( |
| - MapHandleList* receiver_maps, List<Handle<Object>>* handlers, |
| + MapHandles* receiver_maps, List<Handle<Object>>* handlers, |
| KeyedAccessStoreMode store_mode) { |
| DCHECK(store_mode == STANDARD_STORE || |
| store_mode == STORE_AND_GROW_NO_TRANSITION || |
| store_mode == STORE_NO_TRANSITION_IGNORE_OUT_OF_BOUNDS || |
| store_mode == STORE_NO_TRANSITION_HANDLE_COW); |
| - for (int i = 0; i < receiver_maps->length(); ++i) { |
| - Handle<Map> receiver_map(receiver_maps->at(i)); |
| + MapHandles::iterator current_map = receiver_maps->begin(); |
| + MapHandles::iterator last_valid_map = receiver_maps->end(); |
| + while (current_map < last_valid_map) { |
|
Franzi
2017/05/02 16:29:32
Are there strong performance reasons for this patt
danno
2017/05/03 15:10:30
Done.
|
| + Handle<Map> receiver_map = *current_map; |
| if (receiver_map->is_deprecated()) { |
| // Filter out deprecated maps to ensure their instances get migrated. |
| - receiver_maps->Remove(i--); |
| + --last_valid_map; |
| + std::swap(*current_map, *last_valid_map); |
| + receiver_maps->erase(last_valid_map, receiver_maps->end()); |
| continue; |
| } |
| @@ -2127,7 +2134,7 @@ void KeyedStoreIC::StoreElementPolymorphicHandlers( |
| } else { |
| { |
| Map* tmap = |
| - receiver_map->FindElementsKindTransitionedMap(receiver_maps); |
| + receiver_map->FindElementsKindTransitionedMap(*receiver_maps); |
| if (tmap != nullptr) { |
| if (receiver_map->is_stable()) { |
| receiver_map->NotifyLeafMapLayoutChange(); |
| @@ -2165,6 +2172,7 @@ void KeyedStoreIC::StoreElementPolymorphicHandlers( |
| } |
| DCHECK(!handler.is_null()); |
| handlers->Add(handler); |
| + ++current_map; |
| } |
| } |