From bb27633433142633a7f355d710ab5f1657fde5a6 Mon Sep 17 00:00:00 2001 From: "verwaest@chromium.org" Date: Thu, 20 Feb 2014 12:40:34 +0000 Subject: [PATCH] Use ComputeHandlerFlags to find handlers, rather than manually encoding. BUG= R=ishell@chromium.org Review URL: https://codereview.chromium.org/170203003 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@19510 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/ic.cc | 13 +++++++++++-- src/objects.cc | 8 +++++--- src/stub-cache.cc | 19 ++++++++++++++----- src/stub-cache.h | 3 ++- 4 files changed, 32 insertions(+), 11 deletions(-) diff --git a/src/ic.cc b/src/ic.cc index bd06cb6..37fda27 100644 --- a/src/ic.cc +++ b/src/ic.cc @@ -839,8 +839,17 @@ Handle IC::ComputeHandler(LookupResult* lookup, isolate(), *object, cache_holder)); Handle code = isolate()->stub_cache()->FindHandler( - name, handle(stub_holder->map()), kind(), cache_holder); - if (!code.is_null()) return code; + name, handle(stub_holder->map()), kind(), cache_holder, + lookup->IsNormal() ? Code::NORMAL : Code::FAST); + if (!code.is_null()) { +#ifdef DEBUG + Handle compiled = CompileHandler( + lookup, object, name, value, cache_holder); + ASSERT(compiled->major_key() == code->major_key()); + ASSERT(compiled->flags() == code->flags()); +#endif + return code; + } code = CompileHandler(lookup, object, name, value, cache_holder); ASSERT(code->is_handler()); diff --git a/src/objects.cc b/src/objects.cc index 9ecbe6a..7360172 100644 --- a/src/objects.cc +++ b/src/objects.cc @@ -7511,9 +7511,11 @@ MaybeObject* CodeCache::UpdateNormalTypeCache(Name* name, Code* code) { Object* CodeCache::Lookup(Name* name, Code::Flags flags) { - flags = Code::RemoveTypeFromFlags(flags); - Object* result = LookupDefaultCache(name, flags); - if (result->IsCode()) return result; + Object* result = LookupDefaultCache(name, Code::RemoveTypeFromFlags(flags)); + if (result->IsCode()) { + if (Code::cast(result)->flags() == flags) return result; + return GetHeap()->undefined_value(); + } return LookupNormalTypeCache(name, flags); } diff --git a/src/stub-cache.cc b/src/stub-cache.cc index 132ed71..5c72806 100644 --- a/src/stub-cache.cc +++ b/src/stub-cache.cc @@ -116,9 +116,9 @@ Handle StubCache::FindIC(Handle name, Handle StubCache::FindHandler(Handle name, Handle stub_holder, Code::Kind kind, - InlineCacheHolderFlag cache_holder) { - Code::Flags flags = Code::ComputeMonomorphicFlags( - Code::HANDLER, kNoExtraICState, cache_holder, Code::NORMAL); + InlineCacheHolderFlag cache_holder, + Code::StubType type) { + Code::Flags flags = Code::ComputeHandlerFlags(kind, type, cache_holder); Handle probe(stub_holder->FindInCodeCache(*name, flags), isolate_); if (probe->IsCode()) return Handle::cast(probe); @@ -192,8 +192,17 @@ Handle StubCache::ComputeLoadNonexistent(Handle name, // Compile the stub that is either shared for all names or // name specific if there are global objects involved. Handle handler = FindHandler( - cache_name, stub_holder, Code::LOAD_IC, flag); - if (!handler.is_null()) return handler; + cache_name, stub_holder, Code::LOAD_IC, flag, Code::FAST); + if (!handler.is_null()) { +#ifdef DEBUG + LoadStubCompiler compiler(isolate_, kNoExtraICState, flag); + Handle compiled = compiler.CompileLoadNonexistent( + type, last, cache_name); + ASSERT(compiled->major_key() == handler->major_key()); + ASSERT(compiled->flags() == handler->flags()); +#endif + return handler; + } LoadStubCompiler compiler(isolate_, kNoExtraICState, flag); handler = compiler.CompileLoadNonexistent(type, last, cache_name); diff --git a/src/stub-cache.h b/src/stub-cache.h index 7eca6bb..b7c37c3 100644 --- a/src/stub-cache.h +++ b/src/stub-cache.h @@ -89,7 +89,8 @@ class StubCache { Handle FindHandler(Handle name, Handle map, Code::Kind kind, - InlineCacheHolderFlag cache_holder = OWN_MAP); + InlineCacheHolderFlag cache_holder, + Code::StubType type); Handle ComputeMonomorphicIC(Code::Kind kind, Handle name, -- 2.7.4