| Index: src/ic.cc
|
| diff --git a/src/ic.cc b/src/ic.cc
|
| index 1f0070b193dff8b232a3020a1cd72654e44d3bea..e3663c0b5ff8e443a667c3d85b98d6d7647eaa1e 100644
|
| --- a/src/ic.cc
|
| +++ b/src/ic.cc
|
| @@ -1315,7 +1315,15 @@ static bool LookupForWrite(Handle<JSObject> receiver,
|
| LookupResult* lookup) {
|
| receiver->LocalLookup(*name, lookup);
|
| if (!StoreICableLookup(lookup)) {
|
| - return false;
|
| + // 2nd chance: There can be accessors somewhere in the prototype chain, but
|
| + // for compatibility reasons we have to hide this behind a flag. Note that
|
| + // we explicitly exclude native accessors for now, because the stubs are not
|
| + // yet prepared for this scenario.
|
| + if (!FLAG_es5_readonly) return false;
|
| + receiver->Lookup(*name, lookup);
|
| + if (!lookup->IsCallbacks()) return false;
|
| + Handle<Object> callback(lookup->GetCallbackObject());
|
| + return callback->IsAccessorPair() && StoreICableLookup(lookup);
|
| }
|
|
|
| if (lookup->IsInterceptor() &&
|
| @@ -1494,7 +1502,8 @@ void StoreIC::UpdateCaches(LookupResult* lookup,
|
| if (holder->IsGlobalObject()) return;
|
| if (!receiver->HasFastProperties()) return;
|
| code = isolate()->stub_cache()->ComputeStoreViaSetter(
|
| - name, receiver, Handle<JSFunction>::cast(setter), strict_mode);
|
| + name, receiver, holder, Handle<JSFunction>::cast(setter),
|
| + strict_mode);
|
| } else {
|
| ASSERT(callback->IsForeign());
|
| // No IC support for old-style native accessors.
|
|
|