| Index: src/ic.cc
|
| diff --git a/src/ic.cc b/src/ic.cc
|
| index 77e01967f6a80fe405c3a12f7043d2da88b66d88..029aafdcf714cb08d71721494717afc566ad78a2 100644
|
| --- a/src/ic.cc
|
| +++ b/src/ic.cc
|
| @@ -936,15 +936,7 @@ MaybeObject* LoadIC::Load(State state,
|
| }
|
|
|
| // Update inline cache and stub cache.
|
| - 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);
|
| - }
|
| - }
|
| + if (FLAG_use_ic) UpdateCaches(&lookup, state, object, name);
|
|
|
| PropertyAttributes attr;
|
| if (lookup.IsInterceptor() || lookup.IsHandler()) {
|
| @@ -1204,11 +1196,17 @@ void LoadIC::UpdateCaches(LookupResult* lookup,
|
| Handle<Object> object,
|
| Handle<String> name) {
|
| // Bail out if the result is not cacheable.
|
| - if (!lookup->IsCacheable()) return;
|
| + if (!lookup->IsCacheable()) {
|
| + 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;
|
| + // 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;
|
| + }
|
|
|
| Handle<JSObject> receiver = Handle<JSObject>::cast(object);
|
| Handle<Code> code;
|
| @@ -1219,7 +1217,10 @@ void LoadIC::UpdateCaches(LookupResult* lookup,
|
| code = pre_monomorphic_stub();
|
| } else {
|
| code = ComputeLoadHandler(lookup, receiver, name);
|
| - if (code.is_null()) return;
|
| + if (code.is_null()) {
|
| + set_target(*generic_stub());
|
| + return;
|
| + }
|
| }
|
|
|
| PatchCache(state, kNonStrictMode, receiver, name, code);
|
| @@ -1640,6 +1641,12 @@ 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.
|
| @@ -1660,9 +1667,14 @@ 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()) return;
|
| + 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;
|
| + }
|
|
|
| PatchCache(state, strict_mode, receiver, name, code);
|
| TRACE_IC("StoreIC", name, state, target());
|
|
|