| Index: src/ic.cc
|
| diff --git a/src/ic.cc b/src/ic.cc
|
| index 134ef8b843fbff585aa05ada077b5a919eca7a06..0c9e85699b37b4a0c7b88afebf6b56b75122dd35 100644
|
| --- a/src/ic.cc
|
| +++ b/src/ic.cc
|
| @@ -988,13 +988,24 @@ void LoadIC::UpdateCaches(LookupResult* lookup,
|
| }
|
| break;
|
| case CALLBACKS: {
|
| - Handle<Object> callback_object(lookup->GetCallbackObject());
|
| - if (!callback_object->IsAccessorInfo()) return;
|
| - Handle<AccessorInfo> callback =
|
| - Handle<AccessorInfo>::cast(callback_object);
|
| - if (v8::ToCData<Address>(callback->getter()) == 0) return;
|
| - code = isolate()->stub_cache()->ComputeLoadCallback(
|
| - name, receiver, holder, callback);
|
| + Handle<Object> callback(lookup->GetCallbackObject());
|
| + if (callback->IsAccessorInfo()) {
|
| + Handle<AccessorInfo> info = Handle<AccessorInfo>::cast(callback);
|
| + if (v8::ToCData<Address>(info->getter()) == 0) return;
|
| + code = isolate()->stub_cache()->ComputeLoadCallback(
|
| + name, receiver, holder, info);
|
| + } else if (callback->IsAccessorPair()) {
|
| + Handle<Object> getter(Handle<AccessorPair>::cast(callback)->getter());
|
| + if (!getter->IsJSFunction()) return;
|
| + if (holder->IsGlobalObject()) return;
|
| + if (!receiver->HasFastProperties()) return;
|
| + code = isolate()->stub_cache()->ComputeLoadViaGetter(
|
| + name, receiver, holder, Handle<JSFunction>::cast(getter));
|
| + } else {
|
| + ASSERT(callback->IsForeign());
|
| + // No IC support for old-style native accessors.
|
| + return;
|
| + }
|
| break;
|
| }
|
| case INTERCEPTOR:
|
|
|