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

Unified Diff: src/ic/ic.cc

Issue 1853373004: Keyed IC cleanup: we always return Handle<Code>(), so just return void instead. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 8 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') | no next file » | 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 8a7bdc25968964bfc5034210f88efc10a74ee7e7..17614fa4ec8f1249f4ff8cdae77356d377a15869 100644
--- a/src/ic/ic.cc
+++ b/src/ic/ic.cc
@@ -592,8 +592,8 @@ MaybeHandle<Object> LoadIC::Load(Handle<Object> object, Handle<Name> name) {
if (FLAG_use_ic) {
DCHECK(UseVector());
ConfigureVectorState(MEGAMORPHIC);
- TRACE_IC("LoadIC", name);
TRACE_GENERIC_IC(isolate(), "LoadIC", "name as array index");
+ TRACE_IC("LoadIC", name);
}
Handle<Object> result;
ASSIGN_RETURN_ON_EXCEPTION(isolate(), result,
@@ -1146,8 +1146,7 @@ static Handle<Object> TryConvertKey(Handle<Object> key, Isolate* isolate) {
return key;
}
-
-Handle<Code> KeyedLoadIC::LoadElementStub(Handle<HeapObject> receiver) {
+void KeyedLoadIC::UpdateLoadElement(Handle<HeapObject> receiver) {
Handle<Map> receiver_map(receiver->map(), isolate());
DCHECK(receiver_map->instance_type() != JS_VALUE_TYPE); // Checked by caller.
MapHandleList target_receiver_maps;
@@ -1157,15 +1156,14 @@ Handle<Code> KeyedLoadIC::LoadElementStub(Handle<HeapObject> receiver) {
Handle<Code> handler =
PropertyICCompiler::ComputeKeyedLoadMonomorphicHandler(
receiver_map, extra_ic_state());
- ConfigureVectorState(Handle<Name>::null(), receiver_map, handler);
- return Handle<Code>();
+ return ConfigureVectorState(Handle<Name>(), receiver_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) {
TRACE_GENERIC_IC(isolate(), "KeyedLoadIC", "JSValue");
- return Handle<Code>();
+ return;
}
}
@@ -1183,8 +1181,7 @@ Handle<Code> KeyedLoadIC::LoadElementStub(Handle<HeapObject> receiver) {
Handle<Code> handler =
PropertyICCompiler::ComputeKeyedLoadMonomorphicHandler(
receiver_map, extra_ic_state());
- ConfigureVectorState(Handle<Name>::null(), receiver_map, handler);
- return Handle<Code>();
+ return ConfigureVectorState(Handle<Name>(), receiver_map, handler);
}
DCHECK(state() != GENERIC);
@@ -1195,21 +1192,20 @@ Handle<Code> KeyedLoadIC::LoadElementStub(Handle<HeapObject> receiver) {
// If the miss wasn't due to an unseen map, a polymorphic stub
// won't help, use the generic stub.
TRACE_GENERIC_IC(isolate(), "KeyedLoadIC", "same map added twice");
- return Handle<Code>();
+ return;
}
// If the maximum number of receiver maps has been exceeded, use the generic
// version of the IC.
if (target_receiver_maps.length() > kMaxKeyedPolymorphism) {
TRACE_GENERIC_IC(isolate(), "KeyedLoadIC", "max polymorph exceeded");
- return Handle<Code>();
+ return;
}
CodeHandleList handlers(target_receiver_maps.length());
ElementHandlerCompiler compiler(isolate());
compiler.CompileElementHandlers(&target_receiver_maps, &handlers);
- ConfigureVectorState(Handle<Name>::null(), &target_receiver_maps, &handlers);
- return Handle<Code>();
+ ConfigureVectorState(Handle<Name>(), &target_receiver_maps, &handlers);
}
@@ -1224,7 +1220,6 @@ MaybeHandle<Object> KeyedLoadIC::Load(Handle<Object> object,
}
Handle<Object> load_handle;
- Handle<Code> stub;
// Check for non-string values that can be converted into an
// internalized string directly or is representable as a smi.
@@ -1238,19 +1233,15 @@ MaybeHandle<Object> KeyedLoadIC::Load(Handle<Object> object,
!object->IsJSValue()) {
if (object->IsJSObject() || (object->IsString() && key->IsNumber())) {
Handle<HeapObject> receiver = Handle<HeapObject>::cast(object);
- if (object->IsString() || key->IsSmi()) stub = LoadElementStub(receiver);
+ if (object->IsString() || key->IsSmi()) UpdateLoadElement(receiver);
}
}
- DCHECK(UseVector());
if (!is_vector_set()) {
- if (stub.is_null()) {
- ConfigureVectorState(MEGAMORPHIC);
- TRACE_GENERIC_IC(isolate(), "KeyedLoadIC", "set generic");
- }
-
- TRACE_IC("LoadIC", key);
+ ConfigureVectorState(MEGAMORPHIC);
+ TRACE_GENERIC_IC(isolate(), "KeyedLoadIC", "set generic");
}
+ TRACE_IC("LoadIC", key);
if (!load_handle.is_null()) return load_handle;
@@ -1631,9 +1622,8 @@ Handle<Code> StoreIC::CompileHandler(LookupIterator* lookup,
return slow_stub();
}
-
-Handle<Code> KeyedStoreIC::StoreElementStub(Handle<Map> receiver_map,
- KeyedAccessStoreMode store_mode) {
+void KeyedStoreIC::UpdateStoreElement(Handle<Map> receiver_map,
+ KeyedAccessStoreMode store_mode) {
MapHandleList target_receiver_maps;
TargetMaps(&target_receiver_maps);
if (target_receiver_maps.length() == 0) {
@@ -1643,8 +1633,7 @@ Handle<Code> KeyedStoreIC::StoreElementStub(Handle<Map> receiver_map,
Handle<Code> handler =
PropertyICCompiler::ComputeKeyedStoreMonomorphicHandler(
monomorphic_map, language_mode(), store_mode);
- ConfigureVectorState(Handle<Name>::null(), monomorphic_map, handler);
- return Handle<Code>();
+ return ConfigureVectorState(Handle<Name>(), monomorphic_map, handler);
}
// There are several special cases where an IC that is MONOMORPHIC can still
@@ -1670,22 +1659,21 @@ Handle<Code> KeyedStoreIC::StoreElementStub(Handle<Map> receiver_map,
Handle<Code> handler =
PropertyICCompiler::ComputeKeyedStoreMonomorphicHandler(
transitioned_receiver_map, language_mode(), store_mode);
- ConfigureVectorState(Handle<Name>::null(), transitioned_receiver_map,
- handler);
- return Handle<Code>();
- } else if (receiver_map.is_identical_to(previous_receiver_map) &&
- old_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)) {
+ ConfigureVectorState(Handle<Name>(), transitioned_receiver_map, handler);
+ return;
+ }
+ if (receiver_map.is_identical_to(previous_receiver_map) &&
+ old_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)) {
// A "normal" IC that handles stores can switch to a version that can
// grow at the end of the array, handle OOB accesses or copy COW arrays
// and still stay MONOMORPHIC.
Handle<Code> handler =
PropertyICCompiler::ComputeKeyedStoreMonomorphicHandler(
receiver_map, language_mode(), store_mode);
- ConfigureVectorState(Handle<Name>::null(), receiver_map, handler);
- return Handle<Code>();
+ return ConfigureVectorState(Handle<Name>(), receiver_map, handler);
}
}
@@ -1705,14 +1693,12 @@ Handle<Code> KeyedStoreIC::StoreElementStub(Handle<Map> receiver_map,
// If the miss wasn't due to an unseen map, a polymorphic stub
// won't help, use the megamorphic stub which can handle everything.
TRACE_GENERIC_IC(isolate(), "KeyedStoreIC", "same map added twice");
- return Handle<Code>();
+ return;
}
// If the maximum number of receiver maps has been exceeded, use the
// megamorphic version of the IC.
- if (target_receiver_maps.length() > kMaxKeyedPolymorphism) {
- return Handle<Code>();
- }
+ if (target_receiver_maps.length() > kMaxKeyedPolymorphism) return;
// Make sure all polymorphic handlers have the same store mode, otherwise the
// megamorphic stub must be used.
@@ -1722,7 +1708,7 @@ Handle<Code> KeyedStoreIC::StoreElementStub(Handle<Map> receiver_map,
store_mode = old_store_mode;
} else if (store_mode != old_store_mode) {
TRACE_GENERIC_IC(isolate(), "KeyedStoreIC", "store mode mismatch");
- return Handle<Code>();
+ return;
}
}
@@ -1740,7 +1726,7 @@ Handle<Code> KeyedStoreIC::StoreElementStub(Handle<Map> receiver_map,
external_arrays != target_receiver_maps.length()) {
TRACE_GENERIC_IC(isolate(), "KeyedStoreIC",
"unsupported combination of external and normal arrays");
- return Handle<Code>();
+ return;
}
}
@@ -1750,7 +1736,6 @@ Handle<Code> KeyedStoreIC::StoreElementStub(Handle<Map> receiver_map,
&target_receiver_maps, &transitioned_maps, &handlers, store_mode,
language_mode());
ConfigureVectorState(&target_receiver_maps, &transitioned_maps, &handlers);
- return Handle<Code>();
}
@@ -1923,7 +1908,6 @@ MaybeHandle<Object> KeyedStoreIC::Store(Handle<Object> object,
value, language_mode()),
Object);
- Handle<Code> stub;
if (use_ic) {
if (!old_receiver_map.is_null()) {
if (sloppy_arguments_elements) {
@@ -1934,7 +1918,7 @@ MaybeHandle<Object> KeyedStoreIC::Store(Handle<Object> object,
// other non-dictionary receivers in the polymorphic case benefit
// from fast path keyed stores.
if (!old_receiver_map->DictionaryElementsInPrototypeChainOnly()) {
- stub = StoreElementStub(old_receiver_map, store_mode);
+ UpdateStoreElement(old_receiver_map, store_mode);
} else {
TRACE_GENERIC_IC(isolate(), "KeyedStoreIC",
"dictionary or proxy prototype");
@@ -1948,11 +1932,8 @@ MaybeHandle<Object> KeyedStoreIC::Store(Handle<Object> object,
}
if (!is_vector_set()) {
- if (stub.is_null() || *stub == *slow_stub()) {
- ConfigureVectorState(MEGAMORPHIC);
- TRACE_GENERIC_IC(isolate(), "KeyedStoreIC",
- stub.is_null() ? "set generic" : "slow stub");
- }
+ ConfigureVectorState(MEGAMORPHIC);
+ TRACE_GENERIC_IC(isolate(), "KeyedStoreIC", "set generic");
}
TRACE_IC("StoreIC", key);
« no previous file with comments | « src/ic/ic.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698