perf: use v8::Local<v8::Object> as the key in ObjectCache (#43662)

* perf: use v8::Object* as direct keys instead of using hash + a linked list

* refactor: use v8::Local<v8::Object> as the key

Co-authored-by: Charles Kerr <charles@charleskerr.com>
This commit is contained in:
Shelley Vohr 2024-09-10 16:21:21 +02:00 committed by GitHub
parent 57cca46286
commit 7034537852
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 25 additions and 35 deletions

View file

@ -12,37 +12,22 @@ namespace electron::api::context_bridge {
ObjectCache::ObjectCache() = default;
ObjectCache::~ObjectCache() = default;
void ObjectCache::CacheProxiedObject(v8::Local<v8::Value> from,
void ObjectCache::CacheProxiedObject(const v8::Local<v8::Value> from,
v8::Local<v8::Value> proxy_value) {
if (from->IsObject() && !from->IsNullOrUndefined()) {
auto obj = from.As<v8::Object>();
int hash = obj->GetIdentityHash();
proxy_map_[hash].emplace_front(from, proxy_value);
}
if (from->IsObject() && !from->IsNullOrUndefined())
proxy_map_.insert_or_assign(from.As<v8::Object>(), proxy_value);
}
v8::MaybeLocal<v8::Value> ObjectCache::GetCachedProxiedObject(
v8::Local<v8::Value> from) const {
const v8::Local<v8::Value> from) const {
if (!from->IsObject() || from->IsNullOrUndefined())
return v8::MaybeLocal<v8::Value>();
return {};
auto obj = from.As<v8::Object>();
int hash = obj->GetIdentityHash();
auto iter = proxy_map_.find(hash);
if (iter == proxy_map_.end())
return v8::MaybeLocal<v8::Value>();
const auto iter = proxy_map_.find(from.As<v8::Object>());
if (iter == proxy_map_.end() || iter->second.IsEmpty())
return {};
auto& list = iter->second;
for (const auto& pair : list) {
auto from_cmp = pair.first;
if (from_cmp == from) {
if (pair.second.IsEmpty())
return v8::MaybeLocal<v8::Value>();
return pair.second;
}
}
return v8::MaybeLocal<v8::Value>();
return iter->second;
}
} // namespace electron::api::context_bridge