Reviewers: Kasper Lund, Description: Improved version of LookupForRead (tnx to Kasper) + some faster paths.
1) add no GC check; 2) do not use recursion; Please review this at http://codereview.chromium.org/155141 SVN Base: http://v8.googlecode.com/svn/branches/bleeding_edge/ Affected files: M src/ic.cc Index: src/ic.cc =================================================================== --- src/ic.cc (revision 2378) +++ src/ic.cc (working copy) @@ -273,28 +273,36 @@ static void LookupForRead(Object* object, String* name, LookupResult* lookup) { - object->Lookup(name, lookup); - if (lookup->IsNotFound() || lookup->type() != INTERCEPTOR) { - return; - } + AssertNoAllocation no_gc; // pointers must stay valid - JSObject* holder = lookup->holder(); - if (HasInterceptorGetter(holder)) { - return; - } + // Skip all the objects with named interceptors, but + // without actual getter. + while (true) { + object->Lookup(name, lookup); + if (lookup->IsNotFound() || lookup->type() != INTERCEPTOR || + !lookup->IsCacheable()) { + return; + } - // There is no getter, just skip it and lookup down the proto chain - holder->LocalLookupRealNamedProperty(name, lookup); - if (lookup->IsValid()) { - return; - } + JSObject* holder = lookup->holder(); + if (HasInterceptorGetter(holder)) { + return; + } - Object* proto = holder->GetPrototype(); - if (proto == Heap::null_value()) { - return; + holder->LocalLookupRealNamedProperty(name, lookup); + if (lookup->IsValid()) { + ASSERT(lookup->type() != INTERCEPTOR); + return; + } + + Object* proto = holder->GetPrototype(); + if (proto->IsNull()) { + lookup->NotFound(); + return; + } + + object = proto; } - - LookupForRead(proto, name, lookup); } --~--~---------~--~----~------------~-------~--~----~ v8-dev mailing list [email protected] http://groups.google.com/group/v8-dev -~----------~----~----~----~------~----~------~--~---
