| Index: src/ic.cc
|
| diff --git a/src/ic.cc b/src/ic.cc
|
| index 134ef8b843fbff585aa05ada077b5a919eca7a06..94e99e2445169c36ebf8607cd37505fcd942da67 100644
|
| --- a/src/ic.cc
|
| +++ b/src/ic.cc
|
| @@ -36,6 +36,10 @@
|
| #include "runtime.h"
|
| #include "stub-cache.h"
|
|
|
| +#if DEBUG
|
| +#define DEBUG_LOADIC 0
|
| +#endif
|
| +
|
| namespace v8 {
|
| namespace internal {
|
|
|
| @@ -900,6 +904,13 @@ MaybeObject* LoadIC::Load(State state,
|
| // Named lookup in the object.
|
| LookupResult lookup(isolate());
|
| LookupForRead(object, name, &lookup);
|
| +#if DEBUG_LOADIC
|
| + PrintF("==============================2 LoadIC::Load ");
|
| + name->Print();
|
| + PrintF(", ");
|
| + lookup.Print(stdout);
|
| + PrintF("\n");
|
| +#endif
|
|
|
| // If we did not find a property, check if we need to throw an exception.
|
| if (!lookup.IsProperty()) {
|
| @@ -938,6 +949,11 @@ void LoadIC::UpdateCaches(LookupResult* lookup,
|
| State state,
|
| Handle<Object> object,
|
| Handle<String> name) {
|
| +#if DEBUG_LOADIC
|
| + PrintF("==============================3 LoadIC::UpdateCaches ");
|
| + name->Print();
|
| + PrintF(", state=%s\n", Code::ICState2String(state));
|
| +#endif
|
| // Bail out if the result is not cacheable.
|
| if (!lookup->IsCacheable()) return;
|
|
|
| @@ -988,13 +1004,40 @@ 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);
|
| +#if DEBUG_LOADIC
|
| + PrintF("==============================4 LoadIC::UpdateCaches ");
|
| + name->Print();
|
| + PrintF(", CALLBACKS case, target=");
|
| + target()->Print();
|
| + PrintF("\n");
|
| +#endif
|
| + 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));
|
| + // TODO(svenpanne) Remove me when all platforms work.
|
| + if (code.is_null()) return;
|
| +#if DEBUG_LOADIC
|
| + PrintF("==============================5 LoadIC::UpdateCaches ");
|
| + name->Print();
|
| + PrintF(", code=");
|
| + code->Print();
|
| + PrintF("\n");
|
| +#endif
|
| + } else {
|
| + ASSERT(callback->IsForeign());
|
| + // No IC support for old-style native accessors.
|
| + return;
|
| + }
|
| break;
|
| }
|
| case INTERCEPTOR:
|
| @@ -2027,6 +2070,11 @@ RUNTIME_FUNCTION(MaybeObject*, KeyedCallIC_Miss) {
|
|
|
| // Used from ic-<arch>.cc.
|
| RUNTIME_FUNCTION(MaybeObject*, LoadIC_Miss) {
|
| +#if DEBUG_LOADIC
|
| + PrintF("==============================1 LoadIC_Miss ");
|
| + args.at<String>(1)->Print();
|
| + PrintF("\n");
|
| +#endif
|
| HandleScope scope(isolate);
|
| ASSERT(args.length() == 2);
|
| LoadIC ic(isolate);
|
|
|