Index: src/ic.h |
diff --git a/src/ic.h b/src/ic.h |
index bb1ea3c2ab2a8c5311f66128f7e5710088c33862..44dd3c8c41a72f20bc0b2dcb6073f33dc6dceab0 100644 |
--- a/src/ic.h |
+++ b/src/ic.h |
@@ -192,30 +192,23 @@ class IC { |
} |
void UpdateMonomorphicIC(Handle<Code> handler, Handle<String> name); |
- |
bool UpdatePolymorphicIC(Handle<String> name, Handle<Code> code); |
- |
- virtual void UpdateMegamorphicCache(HeapType* type, Name* name, Code* code); |
+ void UpdateMegamorphicCache(HeapType* type, Name* name, Code* code); |
void CopyICToMegamorphicCache(Handle<String> name); |
bool IsTransitionOfMonomorphicTarget(Map* source_map, Map* target_map); |
void PatchCache(Handle<String> name, Handle<Code> code); |
- virtual Code::Kind kind() const { |
- UNREACHABLE(); |
- return Code::STUB; |
- } |
- virtual Handle<Code> slow_stub() const { |
- UNREACHABLE(); |
- return Handle<Code>::null(); |
+ Code::Kind kind() const { return kind_; } |
+ Code::Kind handler_kind() const { |
+ if (kind_ == Code::KEYED_LOAD_IC) return Code::LOAD_IC; |
+ ASSERT(kind_ == Code::LOAD_IC || kind_ == Code::STORE_IC || |
+ kind_ == Code::KEYED_STORE_IC); |
+ return kind_; |
} |
virtual Handle<Code> megamorphic_stub() { |
UNREACHABLE(); |
return Handle<Code>::null(); |
} |
- virtual Handle<Code> generic_stub() const { |
- UNREACHABLE(); |
- return Handle<Code>::null(); |
- } |
bool TryRemoveInvalidPrototypeDependentStub(Handle<Object> receiver, |
Handle<String> name); |
@@ -288,6 +281,7 @@ class IC { |
Handle<Code> target_; |
bool target_set_; |
State state_; |
+ Code::Kind kind_; |
Handle<HeapType> receiver_type_; |
MaybeHandle<Code> maybe_handler_; |
@@ -442,8 +436,6 @@ class LoadIC: public IC { |
Handle<String> name); |
protected: |
- virtual Code::Kind kind() const { return Code::LOAD_IC; } |
- |
void set_target(Code* code) { |
// The contextual mode must be preserved across IC patching. |
ASSERT(GetContextualMode(code->extra_ic_state()) == |
@@ -452,12 +444,16 @@ class LoadIC: public IC { |
IC::set_target(code); |
} |
- virtual Handle<Code> slow_stub() const { |
- return isolate()->builtins()->LoadIC_Slow(); |
+ Handle<Code> slow_stub() const { |
+ if (kind() == Code::LOAD_IC) { |
+ return isolate()->builtins()->LoadIC_Slow(); |
+ } else { |
+ ASSERT_EQ(Code::KEYED_LOAD_IC, kind()); |
+ return isolate()->builtins()->KeyedLoadIC_Slow(); |
+ } |
} |
virtual Handle<Code> megamorphic_stub(); |
- virtual Handle<Code> generic_stub() const; |
// Update the inline cache and the global stub cache based on the |
// lookup result. |
@@ -472,13 +468,9 @@ class LoadIC: public IC { |
CacheHolderFlag cache_holder); |
private: |
- // Stub accessors. |
+ virtual Handle<Code> pre_monomorphic_stub() const; |
static Handle<Code> pre_monomorphic_stub(Isolate* isolate, |
- ExtraICState exstra_state); |
- |
- virtual Handle<Code> pre_monomorphic_stub() { |
- return pre_monomorphic_stub(isolate(), extra_ic_state()); |
- } |
+ ExtraICState extra_state); |
Handle<Code> SimpleFieldLoad(FieldIndex index); |
@@ -520,28 +512,17 @@ class KeyedLoadIC: public LoadIC { |
static const int kSlowCaseBitFieldMask = |
(1 << Map::kIsAccessCheckNeeded) | (1 << Map::kHasIndexedInterceptor); |
- protected: |
- virtual Code::Kind kind() const { return Code::KEYED_LOAD_IC; } |
+ static Handle<Code> generic_stub(Isolate* isolate); |
+ static Handle<Code> pre_monomorphic_stub(Isolate* isolate); |
+ protected: |
Handle<Code> LoadElementStub(Handle<JSObject> receiver); |
- |
- virtual Handle<Code> megamorphic_stub(); |
- virtual Handle<Code> generic_stub() const; |
- |
- virtual Handle<Code> slow_stub() const { |
- return isolate()->builtins()->KeyedLoadIC_Slow(); |
+ virtual Handle<Code> pre_monomorphic_stub() const { |
+ return pre_monomorphic_stub(isolate()); |
} |
- virtual void UpdateMegamorphicCache(HeapType* type, Name* name, Code* code) {} |
- |
private: |
- // Stub accessors. |
- static Handle<Code> pre_monomorphic_stub(Isolate* isolate) { |
- return isolate->builtins()->KeyedLoadIC_PreMonomorphic(); |
- } |
- virtual Handle<Code> pre_monomorphic_stub() { |
- return pre_monomorphic_stub(isolate()); |
- } |
+ Handle<Code> generic_stub() const { return generic_stub(isolate()); } |
Handle<Code> indexed_interceptor_stub() { |
return isolate()->builtins()->KeyedLoadIC_IndexedInterceptor(); |
} |
@@ -618,7 +599,6 @@ class StoreIC: public IC { |
JSReceiver::CERTAINLY_NOT_STORE_FROM_KEYED); |
protected: |
- virtual Code::Kind kind() const { return Code::STORE_IC; } |
virtual Handle<Code> megamorphic_stub(); |
// Stub accessors. |
@@ -628,7 +608,7 @@ class StoreIC: public IC { |
return isolate()->builtins()->StoreIC_Slow(); |
} |
- virtual Handle<Code> pre_monomorphic_stub() { |
+ virtual Handle<Code> pre_monomorphic_stub() const { |
return pre_monomorphic_stub(isolate(), strict_mode()); |
} |
@@ -724,11 +704,7 @@ class KeyedStoreIC: public StoreIC { |
static void GenerateSloppyArguments(MacroAssembler* masm); |
protected: |
- virtual Code::Kind kind() const { return Code::KEYED_STORE_IC; } |
- |
- virtual void UpdateMegamorphicCache(HeapType* type, Name* name, Code* code) {} |
- |
- virtual Handle<Code> pre_monomorphic_stub() { |
+ virtual Handle<Code> pre_monomorphic_stub() const { |
return pre_monomorphic_stub(isolate(), strict_mode()); |
} |
static Handle<Code> pre_monomorphic_stub(Isolate* isolate, |