| Index: src/lookup.cc
|
| diff --git a/src/lookup.cc b/src/lookup.cc
|
| index 7d74ffbf570ad65088cee39decb7f9753f682188..e3227dfc329873d26cdf7b452a51c40f5052455b 100644
|
| --- a/src/lookup.cc
|
| +++ b/src/lookup.cc
|
| @@ -390,23 +390,19 @@ void LookupIterator::TransitionToAccessorPair(Handle<Object> pair,
|
|
|
| bool LookupIterator::HolderIsReceiverOrHiddenPrototype() const {
|
| DCHECK(has_property_ || state_ == INTERCEPTOR || state_ == JSPROXY);
|
| - return InternalHolderIsReceiverOrHiddenPrototype();
|
| -}
|
| -
|
| -bool LookupIterator::InternalHolderIsReceiverOrHiddenPrototype() const {
|
| // Optimization that only works if configuration_ is not mutable.
|
| if (!check_prototype_chain()) return true;
|
| DisallowHeapAllocation no_gc;
|
| if (!receiver_->IsJSReceiver()) return false;
|
| JSReceiver* current = JSReceiver::cast(*receiver_);
|
| - JSReceiver* holder = *holder_;
|
| - if (current == holder) return true;
|
| - if (!holder->map()->is_hidden_prototype()) return false;
|
| + JSReceiver* object = *holder_;
|
| + if (current == object) return true;
|
| + if (!object->map()->is_hidden_prototype()) return false;
|
| // JSProxy do not occur as hidden prototypes.
|
| if (current->IsJSProxy()) return false;
|
| PrototypeIterator iter(isolate(), current);
|
| while (!iter.IsAtEnd(PrototypeIterator::END_AT_NON_HIDDEN)) {
|
| - if (iter.GetCurrent<JSReceiver>() == holder) return true;
|
| + if (iter.GetCurrent<JSReceiver>() == object) return true;
|
| iter.Advance();
|
| }
|
| return false;
|
| @@ -523,26 +519,14 @@ void LookupIterator::WriteDataValue(Handle<Object> value) {
|
|
|
|
|
| bool LookupIterator::IsIntegerIndexedExotic(JSReceiver* holder) {
|
| - DCHECK(exotic_index_state_ != ExoticIndexState::kNotExotic);
|
| - if (exotic_index_state_ == ExoticIndexState::kExotic) return true;
|
| - if (!InternalHolderIsReceiverOrHiddenPrototype()) {
|
| - exotic_index_state_ = ExoticIndexState::kNotExotic;
|
| - return false;
|
| - }
|
| - DCHECK(exotic_index_state_ == ExoticIndexState::kUninitialized);
|
| - bool result = false;
|
| - // Compute and cache result.
|
| - if (IsElement()) {
|
| - result = index_ >= JSTypedArray::cast(holder)->length_value();
|
| - } else if (name()->IsString()) {
|
| - Handle<String> name_string = Handle<String>::cast(name());
|
| - if (name_string->length() != 0) {
|
| - result = IsSpecialIndex(isolate_->unicode_cache(), *name_string);
|
| - }
|
| - }
|
| - exotic_index_state_ =
|
| - result ? ExoticIndexState::kExotic : ExoticIndexState::kNotExotic;
|
| - return result;
|
| + 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);
|
| }
|
|
|
|
|
| @@ -629,14 +613,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_ == Object::cast(holder) && holder->IsJSTypedArray()) {
|
| + if (*receiver_ == holder && holder->IsJSTypedArray()) {
|
| return INTEGER_INDEXED_EXOTIC;
|
| }
|
| return NOT_FOUND;
|
| }
|
| property_details_ = accessor->GetDetails(js_object, number_);
|
| - } else if (exotic_index_state_ != ExoticIndexState::kNotExotic &&
|
| - holder->IsJSTypedArray() && IsIntegerIndexedExotic(holder)) {
|
| + } else if (holder->IsJSTypedArray() && IsIntegerIndexedExotic(holder)) {
|
| return INTEGER_INDEXED_EXOTIC;
|
| } else if (!map->is_dictionary_map()) {
|
| DescriptorArray* descriptors = map->instance_descriptors();
|
|
|