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

Unified Diff: src/ic/ic.cc

Issue 2809923002: Unify implementations of Map handles vectors and lists (Closed)
Patch Set: Review feedback Created 3 years, 7 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/ic/ic.h ('k') | src/objects.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/ic/ic.cc
diff --git a/src/ic/ic.cc b/src/ic/ic.cc
index bf6a01e95615e5d50e179847cd3971a8bb8dd1e9..50aa50910a88507c0386c6c5cf352ed7a0c05144 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 (Handle<Map> 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,9 @@ 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 +695,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 +715,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 +733,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;
}
@@ -1323,16 +1324,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 (Handle<Map> map : target_receiver_maps) {
if (map.is_null()) continue;
if (map->instance_type() == JS_VALUE_TYPE) {
TRACE_GENERIC_IC("JSValue");
@@ -1372,19 +1372,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);
}
}
@@ -1429,20 +1429,20 @@ 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));
- if (receiver_map->is_deprecated()) {
- // Filter out deprecated maps to ensure their instances get migrated.
- receiver_maps->Remove(i--);
- continue;
- }
-
+ MapHandles* receiver_maps, List<Handle<Object>>* handlers) {
+ // Filter out deprecated maps to ensure their instances get migrated.
+ receiver_maps->erase(
+ std::remove_if(
+ receiver_maps->begin(), receiver_maps->end(),
+ [](const Handle<Map>& map) { return map->is_deprecated(); }),
+ receiver_maps->end());
+
+ for (Handle<Map> receiver_map : *receiver_maps) {
// Mark all stable receiver maps that have elements kind transition map
// 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();
}
@@ -1925,9 +1925,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);
@@ -1935,9 +1935,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 (Handle<Map> map : target_receiver_maps) {
+ if (!map.is_null() && map->instance_type() == JS_VALUE_TYPE) {
TRACE_GENERIC_IC("JSValue");
return;
}
@@ -2002,7 +2001,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.
@@ -2020,27 +2019,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 (Handle<Map> 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);
}
}
@@ -2106,21 +2105,21 @@ 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));
- if (receiver_map->is_deprecated()) {
- // Filter out deprecated maps to ensure their instances get migrated.
- receiver_maps->Remove(i--);
- continue;
- }
+ // Filter out deprecated maps to ensure their instances get migrated.
+ receiver_maps->erase(
+ std::remove_if(
+ receiver_maps->begin(), receiver_maps->end(),
+ [](const Handle<Map>& map) { return map->is_deprecated(); }),
+ receiver_maps->end());
+ for (Handle<Map> receiver_map : *receiver_maps) {
Handle<Object> handler;
Handle<Map> transitioned_map;
@@ -2134,7 +2133,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();
« no previous file with comments | « src/ic/ic.h ('k') | src/objects.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698