Index: src/lookup.cc |
diff --git a/src/lookup.cc b/src/lookup.cc |
index 752cd7063fe983dee9b88387bfeb8f87082805ba..b855abe97fdb47fba3821215e36310c1e2365553 100644 |
--- a/src/lookup.cc |
+++ b/src/lookup.cc |
@@ -19,8 +19,7 @@ void LookupIterator::Next() { |
DisallowHeapAllocation no_gc; |
has_property_ = false; |
- JSReceiver* holder = |
- maybe_holder_.is_null() ? NULL : *maybe_holder_.ToHandleChecked(); |
+ JSReceiver* holder = *holder_; |
Map* map = *holder_map_; |
// Perform lookup on current holder. |
@@ -36,39 +35,35 @@ void LookupIterator::Next() { |
state_ = LookupInHolder(map, holder); |
} while (!IsFound()); |
- if (holder == NULL) return; |
- |
- maybe_holder_ = handle(holder, isolate_); |
- holder_map_ = handle(map, isolate_); |
+ if (holder != *holder_) { |
+ holder_ = handle(holder, isolate_); |
+ holder_map_ = handle(map, isolate_); |
+ } |
} |
Handle<JSReceiver> LookupIterator::GetRoot() const { |
- Handle<Object> receiver = GetReceiver(); |
- if (receiver->IsJSReceiver()) return Handle<JSReceiver>::cast(receiver); |
+ if (receiver_->IsJSReceiver()) return Handle<JSReceiver>::cast(receiver_); |
Handle<Object> root = |
- handle(receiver->GetRootMap(isolate_)->prototype(), isolate_); |
+ handle(receiver_->GetRootMap(isolate_)->prototype(), isolate_); |
CHECK(!root->IsNull()); |
return Handle<JSReceiver>::cast(root); |
} |
Handle<Map> LookupIterator::GetReceiverMap() const { |
- Handle<Object> receiver = GetReceiver(); |
- if (receiver->IsNumber()) return isolate_->factory()->heap_number_map(); |
- return handle(Handle<HeapObject>::cast(receiver)->map(), isolate_); |
+ if (receiver_->IsNumber()) return isolate_->factory()->heap_number_map(); |
+ return handle(Handle<HeapObject>::cast(receiver_)->map(), isolate_); |
} |
Handle<JSObject> LookupIterator::GetStoreTarget() const { |
- Handle<JSObject> receiver = Handle<JSObject>::cast(GetReceiver()); |
- |
- if (receiver->IsJSGlobalProxy()) { |
- PrototypeIterator iter(isolate(), receiver); |
- if (iter.IsAtEnd()) return receiver; |
+ if (receiver_->IsJSGlobalProxy()) { |
+ PrototypeIterator iter(isolate(), receiver_); |
+ if (iter.IsAtEnd()) return Handle<JSGlobalProxy>::cast(receiver_); |
return Handle<JSGlobalObject>::cast(PrototypeIterator::GetCurrent(iter)); |
} |
- return receiver; |
+ return Handle<JSObject>::cast(receiver_); |
} |
@@ -79,14 +74,13 @@ bool LookupIterator::IsBootstrapping() const { |
bool LookupIterator::HasAccess(v8::AccessType access_type) const { |
DCHECK_EQ(ACCESS_CHECK, state_); |
- DCHECK(is_guaranteed_to_have_holder()); |
return isolate_->MayNamedAccess(GetHolder<JSObject>(), name_, access_type); |
} |
void LookupIterator::ReloadPropertyInformation() { |
state_ = BEFORE_PROPERTY; |
- state_ = LookupInHolder(*holder_map_, *maybe_holder_.ToHandleChecked()); |
+ state_ = LookupInHolder(*holder_map_, *holder_); |
DCHECK(IsFound() || holder_map_->is_dictionary_map()); |
} |
@@ -148,7 +142,7 @@ void LookupIterator::ApplyTransitionToDataProperty() { |
DCHECK_EQ(TRANSITION, state_); |
Handle<JSObject> receiver = GetStoreTarget(); |
- maybe_holder_ = receiver; |
+ holder_ = receiver; |
holder_map_ = transition_map_; |
JSObject::MigrateToMap(receiver, holder_map_); |
ReloadPropertyInformation(); |
@@ -163,7 +157,7 @@ void LookupIterator::TransitionToAccessorProperty( |
// handled via a trap. Adding properties to primitive values is not |
// observable. |
Handle<JSObject> receiver = GetStoreTarget(); |
- maybe_holder_ = receiver; |
+ holder_ = receiver; |
holder_map_ = |
Map::TransitionToAccessorProperty(handle(receiver->map(), isolate_), |
name_, component, accessor, attributes); |
@@ -208,10 +202,9 @@ bool LookupIterator::HolderIsReceiverOrHiddenPrototype() const { |
// Optimization that only works if configuration_ is not mutable. |
if (!check_prototype_chain()) return true; |
DisallowHeapAllocation no_gc; |
- Handle<Object> receiver = GetReceiver(); |
- if (!receiver->IsJSReceiver()) return false; |
- Object* current = *receiver; |
- JSReceiver* holder = *maybe_holder_.ToHandleChecked(); |
+ if (!receiver_->IsJSReceiver()) return false; |
+ Object* current = *receiver_; |
+ JSReceiver* holder = *holder_; |
// JSProxy do not occur as hidden prototypes. |
if (current->IsJSProxy()) { |
return JSReceiver::cast(current) == holder; |
@@ -297,7 +290,6 @@ Handle<Object> LookupIterator::GetDataValue() const { |
void LookupIterator::WriteDataValue(Handle<Object> value) { |
- DCHECK(is_guaranteed_to_have_holder()); |
DCHECK_EQ(DATA, state_); |
Handle<JSObject> holder = GetHolder<JSObject>(); |
if (holder_map_->is_dictionary_map()) { |