Index: src/lookup.cc |
diff --git a/src/lookup.cc b/src/lookup.cc |
index e3227dfc329873d26cdf7b452a51c40f5052455b..4eed6a9f193d1379019f5da7a4f5687d25f1c3f3 100644 |
--- a/src/lookup.cc |
+++ b/src/lookup.cc |
@@ -518,18 +518,6 @@ void LookupIterator::WriteDataValue(Handle<Object> value) { |
} |
-bool LookupIterator::IsIntegerIndexedExotic(JSReceiver* holder) { |
- DCHECK(!IsElement()); |
- if (!name_->IsString()) return false; |
- if (*receiver_ != holder) return false; |
- |
- Handle<String> name_string = Handle<String>::cast(name_); |
- if (name_string->length() == 0) return false; |
- |
- return IsSpecialIndex(isolate_->unicode_cache(), *name_string); |
-} |
- |
- |
void LookupIterator::InternalizeName() { |
if (name_->IsUniqueName()) return; |
name_ = factory()->InternalizeString(Handle<String>::cast(name_)); |
@@ -579,6 +567,17 @@ JSReceiver* LookupIterator::NextHolder(Map* map) { |
return next; |
} |
+LookupIterator::State LookupIterator::NotFound(JSReceiver* const holder) const { |
+ DCHECK(!IsElement()); |
+ if (!holder->IsJSTypedArray() || !name_->IsString()) return NOT_FOUND; |
+ |
+ Handle<String> name_string = Handle<String>::cast(name_); |
+ if (name_string->length() == 0) return NOT_FOUND; |
+ |
+ return IsSpecialIndex(isolate_->unicode_cache(), *name_string) |
+ ? INTEGER_INDEXED_EXOTIC |
+ : NOT_FOUND; |
+} |
LookupIterator::State LookupIterator::LookupInHolder(Map* const map, |
JSReceiver* const holder) { |
@@ -613,18 +612,13 @@ LookupIterator::State LookupIterator::LookupInHolder(Map* const map, |
FixedArrayBase* backing_store = js_object->elements(); |
number_ = accessor->GetEntryForIndex(js_object, backing_store, index_); |
if (number_ == kMaxUInt32) { |
- if (*receiver_ == holder && holder->IsJSTypedArray()) { |
- return INTEGER_INDEXED_EXOTIC; |
- } |
- return NOT_FOUND; |
+ return holder->IsJSTypedArray() ? INTEGER_INDEXED_EXOTIC : NOT_FOUND; |
} |
property_details_ = accessor->GetDetails(js_object, number_); |
- } else if (holder->IsJSTypedArray() && IsIntegerIndexedExotic(holder)) { |
- return INTEGER_INDEXED_EXOTIC; |
} else if (!map->is_dictionary_map()) { |
DescriptorArray* descriptors = map->instance_descriptors(); |
int number = descriptors->SearchWithCache(*name_, map); |
- if (number == DescriptorArray::kNotFound) return NOT_FOUND; |
+ if (number == DescriptorArray::kNotFound) return NotFound(holder); |
number_ = static_cast<uint32_t>(number); |
property_details_ = descriptors->GetDetails(number_); |
} else if (map->IsJSGlobalObjectMap()) { |
@@ -639,7 +633,7 @@ LookupIterator::State LookupIterator::LookupInHolder(Map* const map, |
} else { |
NameDictionary* dict = holder->property_dictionary(); |
int number = dict->FindEntry(name_); |
- if (number == NameDictionary::kNotFound) return NOT_FOUND; |
+ if (number == NameDictionary::kNotFound) return NotFound(holder); |
number_ = static_cast<uint32_t>(number); |
property_details_ = dict->DetailsAt(number_); |
} |