Index: src/ic/ic.cc |
diff --git a/src/ic/ic.cc b/src/ic/ic.cc |
index c59fa5da6b4cd4b756b18c7ae918f300987399f3..cc20c7cd26647dcef47d54c391902aa0bf8606f3 100644 |
--- a/src/ic/ic.cc |
+++ b/src/ic/ic.cc |
@@ -215,6 +215,7 @@ static void LookupForRead(LookupIterator* it) { |
switch (it->state()) { |
case LookupIterator::NOT_FOUND: |
case LookupIterator::TRANSITION: |
+ case LookupIterator::UNKNOWN: |
UNREACHABLE(); |
case LookupIterator::JSPROXY: |
return; |
@@ -234,9 +235,9 @@ static void LookupForRead(LookupIterator* it) { |
break; |
} |
return; |
- case LookupIterator::PROPERTY: |
- if (it->HasProperty()) return; // Yay! |
- break; |
+ case LookupIterator::ACCESSOR: |
+ case LookupIterator::DATA: |
+ return; |
} |
} |
} |
@@ -285,7 +286,7 @@ bool IC::TryRemoveInvalidPrototypeDependentStub(Handle<Object> receiver, |
Handle<GlobalObject> global = Handle<GlobalObject>::cast(receiver); |
LookupIterator it(global, name, LookupIterator::OWN_SKIP_INTERCEPTOR); |
if (it.state() == LookupIterator::ACCESS_CHECK) return false; |
- if (!it.IsFound() || !it.HasProperty()) return false; |
+ if (!it.IsFound()) return false; |
Handle<PropertyCell> cell = it.GetPropertyCell(); |
return cell->type()->IsConstant(); |
} |
@@ -976,8 +977,7 @@ Handle<Code> LoadIC::CompileHandler(LookupIterator* lookup, |
} |
// -------------- Accessors -------------- |
- DCHECK(lookup->state() == LookupIterator::PROPERTY); |
- if (lookup->property_kind() == LookupIterator::ACCESSOR) { |
+ if (lookup->state() == LookupIterator::ACCESSOR) { |
// Use simple field loads for some well-known callback properties. |
if (receiver_is_holder) { |
DCHECK(receiver->IsJSObject()); |
@@ -1032,7 +1032,7 @@ Handle<Code> LoadIC::CompileHandler(LookupIterator* lookup, |
} |
// -------------- Dictionary properties -------------- |
- DCHECK(lookup->property_kind() == LookupIterator::DATA); |
+ DCHECK(lookup->state() == LookupIterator::DATA); |
if (lookup->property_encoding() == LookupIterator::DICTIONARY) { |
if (kind() != Code::LOAD_IC) return slow_stub(); |
if (holder->IsGlobalObject()) { |
@@ -1223,6 +1223,7 @@ bool StoreIC::LookupForWrite(LookupIterator* it, Handle<Object> value, |
switch (it->state()) { |
case LookupIterator::NOT_FOUND: |
case LookupIterator::TRANSITION: |
+ case LookupIterator::UNKNOWN: |
UNREACHABLE(); |
case LookupIterator::JSPROXY: |
return false; |
@@ -1240,11 +1241,12 @@ bool StoreIC::LookupForWrite(LookupIterator* it, Handle<Object> value, |
case LookupIterator::ACCESS_CHECK: |
if (it->GetHolder<JSObject>()->IsAccessCheckNeeded()) return false; |
break; |
- case LookupIterator::PROPERTY: |
- if (!it->HasProperty()) break; |
+ case LookupIterator::ACCESSOR: |
+ return !it->IsReadOnly(); |
+ case LookupIterator::DATA: { |
if (it->IsReadOnly()) return false; |
- if (it->property_kind() == LookupIterator::ACCESSOR) return true; |
- if (it->GetHolder<Object>().is_identical_to(receiver)) { |
+ Handle<JSObject> holder = it->GetHolder<JSObject>(); |
+ if (receiver.is_identical_to(holder)) { |
it->PrepareForDataProperty(value); |
// The previous receiver map might just have been deprecated, |
// so reload it. |
@@ -1253,14 +1255,15 @@ bool StoreIC::LookupForWrite(LookupIterator* it, Handle<Object> value, |
} |
// Receiver != holder. |
+ PrototypeIterator iter(it->isolate(), receiver); |
if (receiver->IsJSGlobalProxy()) { |
- PrototypeIterator iter(it->isolate(), receiver); |
return it->GetHolder<Object>().is_identical_to( |
PrototypeIterator::GetCurrent(iter)); |
} |
it->PrepareTransitionToDataProperty(value, NONE, store_mode); |
return it->IsCacheableTransition(); |
+ } |
} |
} |
@@ -1417,8 +1420,7 @@ Handle<Code> StoreIC::CompileHandler(LookupIterator* lookup, |
} |
// -------------- Accessors -------------- |
- DCHECK(lookup->state() == LookupIterator::PROPERTY); |
- if (lookup->property_kind() == LookupIterator::ACCESSOR) { |
+ if (lookup->state() == LookupIterator::ACCESSOR) { |
if (!holder->HasFastProperties()) return slow_stub(); |
Handle<Object> accessors = lookup->GetAccessors(); |
if (accessors->IsExecutableAccessorInfo()) { |
@@ -1452,7 +1454,7 @@ Handle<Code> StoreIC::CompileHandler(LookupIterator* lookup, |
} |
// -------------- Dictionary properties -------------- |
- DCHECK(lookup->property_kind() == LookupIterator::DATA); |
+ DCHECK(lookup->state() == LookupIterator::DATA); |
if (lookup->property_encoding() == LookupIterator::DICTIONARY) { |
if (holder->IsGlobalObject()) { |
Handle<PropertyCell> cell = lookup->GetPropertyCell(); |