From 78ef2e5b29a79f87d8d1cbad692143c8fc9e6d91 Mon Sep 17 00:00:00 2001 From: verwaest Date: Wed, 1 Jul 2015 07:18:50 -0700 Subject: [PATCH] Micro-optimize lookupiterator: faster path for fast-mode objects BUG=chromium:505998 LOG=n Review URL: https://codereview.chromium.org/1222543003 Cr-Commit-Position: refs/heads/master@{#29419} --- src/lookup-inl.h | 16 ++++++++-------- src/objects-inl.h | 5 +---- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/src/lookup-inl.h b/src/lookup-inl.h index 9b5927b..421cc08 100644 --- a/src/lookup-inl.h +++ b/src/lookup-inl.h @@ -78,7 +78,13 @@ LookupIterator::State LookupIterator::LookupInHolder(Map* const map, if (number_ == kMaxUInt32) return NOT_FOUND; property_details_ = accessor->GetDetails(backing_store, number_); } - } else if (holder->IsGlobalObject()) { + } else if (!map->is_dictionary_map()) { + DescriptorArray* descriptors = map->instance_descriptors(); + int number = descriptors->SearchWithCache(*name_, map); + if (number == DescriptorArray::kNotFound) return NOT_FOUND; + number_ = static_cast(number); + property_details_ = descriptors->GetDetails(number_); + } else if (map->IsGlobalObjectMap()) { GlobalDictionary* dict = JSObject::cast(holder)->global_dictionary(); int number = dict->FindEntry(name_); if (number == GlobalDictionary::kNotFound) return NOT_FOUND; @@ -87,18 +93,12 @@ LookupIterator::State LookupIterator::LookupInHolder(Map* const map, PropertyCell* cell = PropertyCell::cast(dict->ValueAt(number_)); if (cell->value()->IsTheHole()) return NOT_FOUND; property_details_ = cell->property_details(); - } else if (map->is_dictionary_map()) { + } else { NameDictionary* dict = JSObject::cast(holder)->property_dictionary(); int number = dict->FindEntry(name_); if (number == NameDictionary::kNotFound) return NOT_FOUND; number_ = static_cast(number); property_details_ = dict->DetailsAt(number_); - } else { - DescriptorArray* descriptors = map->instance_descriptors(); - int number = descriptors->SearchWithCache(*name_, map); - if (number == DescriptorArray::kNotFound) return NOT_FOUND; - number_ = static_cast(number); - property_details_ = descriptors->GetDetails(number_); } has_property_ = true; switch (property_details_.kind()) { diff --git a/src/objects-inl.h b/src/objects-inl.h index 9f535ca..4b143c8 100644 --- a/src/objects-inl.h +++ b/src/objects-inl.h @@ -1028,10 +1028,7 @@ bool Object::IsJSGlobalProxy() const { bool Object::IsGlobalObject() const { if (!IsHeapObject()) return false; - - InstanceType type = HeapObject::cast(this)->map()->instance_type(); - return type == JS_GLOBAL_OBJECT_TYPE || - type == JS_BUILTINS_OBJECT_TYPE; + return HeapObject::cast(this)->map()->IsGlobalObjectMap(); } -- 2.7.4