Index: src/ic.cc |
diff --git a/src/ic.cc b/src/ic.cc |
index 029aafdcf714cb08d71721494717afc566ad78a2..095b61498623e01b0c6d48c1f0bc8ee6e7343733 100644 |
--- a/src/ic.cc |
+++ b/src/ic.cc |
@@ -936,7 +936,15 @@ MaybeObject* LoadIC::Load(State state, |
} |
// Update inline cache and stub cache. |
- if (FLAG_use_ic) UpdateCaches(&lookup, state, object, name); |
+ if (FLAG_use_ic) { |
+ if (!object->IsJSObject()) { |
+ // TODO(jkummerow): It would be nice to support non-JSObjects in |
+ // UpdateCaches, then we wouldn't need to go generic here. |
+ set_target(*generic_stub()); |
+ } else { |
+ UpdateCaches(&lookup, state, object, name); |
+ } |
+ } |
PropertyAttributes attr; |
if (lookup.IsInterceptor() || lookup.IsHandler()) { |
@@ -1196,17 +1204,11 @@ void LoadIC::UpdateCaches(LookupResult* lookup, |
Handle<Object> object, |
Handle<String> name) { |
// Bail out if the result is not cacheable. |
- if (!lookup->IsCacheable()) { |
- set_target(*generic_stub()); |
- return; |
- } |
+ if (!lookup->IsCacheable()) return; |
- // TODO(jkummerow): It would be nice to support non-JSObjects in |
- // UpdateCaches, then we wouldn't need to go generic here. |
- if (!object->IsJSObject()) { |
- set_target(*generic_stub()); |
- return; |
- } |
+ // Loading properties from values is not common, so don't try to |
+ // deal with non-JS objects here. |
+ if (!object->IsJSObject()) return; |
Handle<JSObject> receiver = Handle<JSObject>::cast(object); |
Handle<Code> code; |
@@ -1217,10 +1219,7 @@ void LoadIC::UpdateCaches(LookupResult* lookup, |
code = pre_monomorphic_stub(); |
} else { |
code = ComputeLoadHandler(lookup, receiver, name); |
- if (code.is_null()) { |
- set_target(*generic_stub()); |
- return; |
- } |
+ if (code.is_null()) return; |
} |
PatchCache(state, kNonStrictMode, receiver, name, code); |
@@ -1641,12 +1640,6 @@ MaybeObject* StoreIC::Store(State state, |
IsUndeclaredGlobal(object)) { |
// Strict mode doesn't allow setting non-existent global property. |
return ReferenceError("not_defined", name); |
- } else if (FLAG_use_ic && |
- (lookup.IsNormal() || |
- (lookup.IsField() && lookup.CanHoldValue(value)))) { |
- Handle<Code> stub = strict_mode == kStrictMode |
- ? generic_stub_strict() : generic_stub(); |
- set_target(*stub); |
} |
// Set the property. |
@@ -1667,14 +1660,9 @@ void StoreIC::UpdateCaches(LookupResult* lookup, |
// These are not cacheable, so we never see such LookupResults here. |
ASSERT(!lookup->IsHandler()); |
- Handle<Code> code = ComputeStoreMonomorphic( |
- lookup, strict_mode, receiver, name); |
- if (code.is_null()) { |
- Handle<Code> stub = strict_mode == kStrictMode |
- ? generic_stub_strict() : generic_stub(); |
- set_target(*stub); |
- return; |
- } |
+ Handle<Code> code = |
+ ComputeStoreMonomorphic(lookup, strict_mode, receiver, name); |
+ if (code.is_null()) return; |
PatchCache(state, strict_mode, receiver, name, code); |
TRACE_IC("StoreIC", name, state, target()); |
@@ -1745,7 +1733,7 @@ Handle<Code> StoreIC::ComputeStoreMonomorphic(LookupResult* lookup, |
DescriptorArray* target_descriptors = transition->instance_descriptors(); |
PropertyDetails details = target_descriptors->GetDetails(descriptor); |
- if (details.type() == CALLBACKS || details.attributes() != NONE) break; |
+ if (details.type() != FIELD || details.attributes() != NONE) break; |
return isolate()->stub_cache()->ComputeStoreTransition( |
name, receiver, lookup, transition, strict_mode); |
@@ -2111,7 +2099,7 @@ Handle<Code> KeyedStoreIC::ComputeStoreMonomorphic(LookupResult* lookup, |
DescriptorArray* target_descriptors = transition->instance_descriptors(); |
PropertyDetails details = target_descriptors->GetDetails(descriptor); |
- if (details.type() != CALLBACKS && details.attributes() == NONE) { |
+ if (details.type() == FIELD && details.attributes() == NONE) { |
return isolate()->stub_cache()->ComputeKeyedStoreTransition( |
name, receiver, lookup, transition, strict_mode); |
} |