Index: src/ic/stub-cache.cc |
diff --git a/src/ic/stub-cache.cc b/src/ic/stub-cache.cc |
index fe1adaaadbbfec248372a502bb685068d30c9a65..9655cc4bbc82dfea5b6501282b5b5b9c52edd4eb 100644 |
--- a/src/ic/stub-cache.cc |
+++ b/src/ic/stub-cache.cc |
@@ -6,13 +6,18 @@ |
#include "src/ast/ast.h" |
#include "src/base/bits.h" |
+#include "src/ic/ic-inl.h" |
#include "src/type-info.h" |
namespace v8 { |
namespace internal { |
StubCache::StubCache(Isolate* isolate, Code::Kind ic_kind) |
- : isolate_(isolate), ic_kind_(ic_kind) {} |
+ : isolate_(isolate), ic_kind_(ic_kind) { |
+ // Ensure the nullptr (aka Smi::kZero) which StubCache::Get() returns |
+ // when the entry is not found is not considered as a handler. |
+ DCHECK(!IC::IsHandler(nullptr)); |
+} |
void StubCache::Initialize() { |
DCHECK(base::bits::IsPowerOfTwo32(kPrimaryTableSize)); |
@@ -24,18 +29,22 @@ void StubCache::Initialize() { |
namespace { |
bool CommonStubCacheChecks(StubCache* stub_cache, Name* name, Map* map, |
- Code* code) { |
+ Object* handler) { |
// Validate that the name does not move on scavenge, and that we |
// can use identity checks instead of structural equality checks. |
DCHECK(!name->GetHeap()->InNewSpace(name)); |
DCHECK(name->IsUniqueName()); |
DCHECK(name->HasHashCode()); |
- if (code) { |
- Code::Flags expected_flags = Code::RemoveHolderFromFlags( |
- Code::ComputeHandlerFlags(stub_cache->ic_kind())); |
- Code::Flags flags = Code::RemoveHolderFromFlags(code->flags()); |
- DCHECK_EQ(expected_flags, flags); |
- DCHECK_EQ(Code::HANDLER, Code::ExtractKindFromFlags(code->flags())); |
+ if (handler) { |
+ DCHECK(IC::IsHandler(handler)); |
+ if (handler->IsCode()) { |
+ Code* code = Code::cast(handler); |
+ Code::Flags expected_flags = Code::RemoveHolderFromFlags( |
+ Code::ComputeHandlerFlags(stub_cache->ic_kind())); |
+ Code::Flags flags = Code::RemoveHolderFromFlags(code->flags()); |
+ DCHECK_EQ(expected_flags, flags); |
+ DCHECK_EQ(Code::HANDLER, Code::ExtractKindFromFlags(code->flags())); |
+ } |
} |
return true; |
} |
@@ -43,17 +52,17 @@ bool CommonStubCacheChecks(StubCache* stub_cache, Name* name, Map* map, |
} // namespace |
#endif |
-Code* StubCache::Set(Name* name, Map* map, Code* code) { |
- DCHECK(CommonStubCacheChecks(this, name, map, code)); |
+Object* StubCache::Set(Name* name, Map* map, Object* handler) { |
+ DCHECK(CommonStubCacheChecks(this, name, map, handler)); |
// Compute the primary entry. |
int primary_offset = PrimaryOffset(name, map); |
Entry* primary = entry(primary_, primary_offset); |
- Code* old_code = primary->value; |
+ Object* old_handler = primary->value; |
// If the primary entry has useful data in it, we retire it to the |
// secondary cache before overwriting it. |
- if (old_code != isolate_->builtins()->builtin(Builtins::kIllegal)) { |
+ if (old_handler != isolate_->builtins()->builtin(Builtins::kIllegal)) { |
Map* old_map = primary->map; |
int seed = PrimaryOffset(primary->key, old_map); |
int secondary_offset = SecondaryOffset(primary->key, seed); |
@@ -63,13 +72,13 @@ Code* StubCache::Set(Name* name, Map* map, Code* code) { |
// Update primary cache. |
primary->key = name; |
- primary->value = code; |
+ primary->value = handler; |
primary->map = map; |
isolate()->counters()->megamorphic_stub_cache_updates()->Increment(); |
- return code; |
+ return handler; |
} |
-Code* StubCache::Get(Name* name, Map* map) { |
+Object* StubCache::Get(Name* name, Map* map) { |
DCHECK(CommonStubCacheChecks(this, name, map, nullptr)); |
int primary_offset = PrimaryOffset(name, map); |
Entry* primary = entry(primary_, primary_offset); |
@@ -81,7 +90,7 @@ Code* StubCache::Get(Name* name, Map* map) { |
if (secondary->key == name && secondary->map == map) { |
return secondary->value; |
} |
- return NULL; |
+ return nullptr; |
} |