[ic] Avoid extra prototype chain iteration when creating a load IC data handler.
Since all possible data-encoded prototype chain checks are supported by LoadIC we can remove this extra iteration. LoadGlobalIC does not support data handlers yet. BUG=v8:5561 Review-Url: https://codereview.chromium.org/2479523002 Cr-Commit-Position: refs/heads/master@{#40738}
This commit is contained in:
parent
3c96c5e232
commit
2010ac0c7d
24
src/ic/ic.cc
24
src/ic/ic.cc
@ -915,10 +915,10 @@ int LoadIC::GetPrototypeCheckCount(Handle<Map> receiver_map,
|
|||||||
Handle<FixedArray>(), Handle<Name>());
|
Handle<FixedArray>(), Handle<Name>());
|
||||||
}
|
}
|
||||||
|
|
||||||
Handle<Object> LoadIC::SimpleLoadFromPrototype(Handle<Map> receiver_map,
|
Handle<Object> LoadIC::LoadFromPrototype(Handle<Map> receiver_map,
|
||||||
Handle<JSObject> holder,
|
Handle<JSObject> holder,
|
||||||
Handle<Name> name,
|
Handle<Name> name,
|
||||||
Handle<Object> smi_handler) {
|
Handle<Object> smi_handler) {
|
||||||
int checks_count = GetPrototypeCheckCount(receiver_map, holder);
|
int checks_count = GetPrototypeCheckCount(receiver_map, holder);
|
||||||
DCHECK_LE(0, checks_count);
|
DCHECK_LE(0, checks_count);
|
||||||
|
|
||||||
@ -950,8 +950,8 @@ Handle<Object> LoadIC::SimpleLoadFromPrototype(Handle<Map> receiver_map,
|
|||||||
return handler_array;
|
return handler_array;
|
||||||
}
|
}
|
||||||
|
|
||||||
Handle<Object> LoadIC::SimpleLoadNonExistent(Handle<Map> receiver_map,
|
Handle<Object> LoadIC::LoadNonExistent(Handle<Map> receiver_map,
|
||||||
Handle<Name> name) {
|
Handle<Name> name) {
|
||||||
Handle<JSObject> holder; // null handle
|
Handle<JSObject> holder; // null handle
|
||||||
int checks_count = GetPrototypeCheckCount(receiver_map, holder);
|
int checks_count = GetPrototypeCheckCount(receiver_map, holder);
|
||||||
DCHECK_LE(0, checks_count);
|
DCHECK_LE(0, checks_count);
|
||||||
@ -1041,7 +1041,7 @@ void LoadIC::UpdateCaches(LookupIterator* lookup) {
|
|||||||
} else if (!lookup->IsFound()) {
|
} else if (!lookup->IsFound()) {
|
||||||
if (kind() == Code::LOAD_IC) {
|
if (kind() == Code::LOAD_IC) {
|
||||||
TRACE_HANDLER_STATS(isolate(), LoadIC_LoadNonexistentDH);
|
TRACE_HANDLER_STATS(isolate(), LoadIC_LoadNonexistentDH);
|
||||||
code = SimpleLoadNonExistent(receiver_map(), lookup->name());
|
code = LoadNonExistent(receiver_map(), lookup->name());
|
||||||
} else if (kind() == Code::LOAD_GLOBAL_IC) {
|
} else if (kind() == Code::LOAD_GLOBAL_IC) {
|
||||||
code = NamedLoadHandlerCompiler::ComputeLoadNonexistent(lookup->name(),
|
code = NamedLoadHandlerCompiler::ComputeLoadNonexistent(lookup->name(),
|
||||||
receiver_map());
|
receiver_map());
|
||||||
@ -1387,10 +1387,9 @@ Handle<Object> LoadIC::GetMapIndependentHandler(LookupIterator* lookup) {
|
|||||||
if (receiver_is_holder) {
|
if (receiver_is_holder) {
|
||||||
return smi_handler;
|
return smi_handler;
|
||||||
}
|
}
|
||||||
if (FLAG_tf_load_ic_stub && GetPrototypeCheckCount(map, holder) >= 0) {
|
if (FLAG_tf_load_ic_stub && kind() != Code::LOAD_GLOBAL_IC) {
|
||||||
TRACE_HANDLER_STATS(isolate(), LoadIC_LoadFieldFromPrototypeDH);
|
TRACE_HANDLER_STATS(isolate(), LoadIC_LoadFieldFromPrototypeDH);
|
||||||
return SimpleLoadFromPrototype(map, holder, lookup->name(),
|
return LoadFromPrototype(map, holder, lookup->name(), smi_handler);
|
||||||
smi_handler);
|
|
||||||
}
|
}
|
||||||
break; // Custom-compiled handler.
|
break; // Custom-compiled handler.
|
||||||
}
|
}
|
||||||
@ -1404,10 +1403,9 @@ Handle<Object> LoadIC::GetMapIndependentHandler(LookupIterator* lookup) {
|
|||||||
TRACE_HANDLER_STATS(isolate(), LoadIC_LoadConstantDH);
|
TRACE_HANDLER_STATS(isolate(), LoadIC_LoadConstantDH);
|
||||||
return smi_handler;
|
return smi_handler;
|
||||||
}
|
}
|
||||||
if (GetPrototypeCheckCount(map, holder) >= 0) {
|
if (kind() != Code::LOAD_GLOBAL_IC) {
|
||||||
TRACE_HANDLER_STATS(isolate(), LoadIC_LoadConstantFromPrototypeDH);
|
TRACE_HANDLER_STATS(isolate(), LoadIC_LoadConstantFromPrototypeDH);
|
||||||
return SimpleLoadFromPrototype(map, holder, lookup->name(),
|
return LoadFromPrototype(map, holder, lookup->name(), smi_handler);
|
||||||
smi_handler);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (receiver_is_holder) {
|
if (receiver_is_holder) {
|
||||||
|
11
src/ic/ic.h
11
src/ic/ic.h
@ -325,14 +325,13 @@ class LoadIC : public IC {
|
|||||||
// Creates a data handler that represents a prototype chain check followed
|
// Creates a data handler that represents a prototype chain check followed
|
||||||
// by given Smi-handler that encoded a load from the holder.
|
// by given Smi-handler that encoded a load from the holder.
|
||||||
// Can be used only if GetPrototypeCheckCount() returns non negative value.
|
// Can be used only if GetPrototypeCheckCount() returns non negative value.
|
||||||
Handle<Object> SimpleLoadFromPrototype(Handle<Map> receiver_map,
|
Handle<Object> LoadFromPrototype(Handle<Map> receiver_map,
|
||||||
Handle<JSObject> holder,
|
Handle<JSObject> holder, Handle<Name> name,
|
||||||
Handle<Name> name,
|
Handle<Object> smi_handler);
|
||||||
Handle<Object> smi_handler);
|
|
||||||
|
|
||||||
// Creates a data handler that represents a load of a non-existent property.
|
// Creates a data handler that represents a load of a non-existent property.
|
||||||
Handle<Object> SimpleLoadNonExistent(Handle<Map> receiver_map,
|
Handle<Object> LoadNonExistent(Handle<Map> receiver_map, Handle<Name> name);
|
||||||
Handle<Name> name);
|
|
||||||
friend class IC;
|
friend class IC;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user