Index: src/ic.h |
diff --git a/src/ic.h b/src/ic.h |
index 0cc6aa461354612ae774a6960537f5e9af465c04..a0c0f381e25f2d72a6fa677f75fde9af5a6f5cbd 100644 |
--- a/src/ic.h |
+++ b/src/ic.h |
@@ -133,6 +133,18 @@ class IC { |
InlineCacheHolderFlag holder); |
protected: |
+ virtual Handle<Code> pre_monomorphic_stub() { |
+ UNREACHABLE(); |
+ return Handle<Code>::null(); |
+ } |
+ virtual Handle<Code> megamorphic_stub() { |
+ UNREACHABLE(); |
+ return Handle<Code>::null(); |
+ } |
+ virtual Code::Kind kind() const { |
+ UNREACHABLE(); |
+ return Code::STUB; |
+ } |
Address fp() const { return fp_; } |
Address pc() const { return *pc_address_; } |
Isolate* isolate() const { return isolate_; } |
@@ -165,6 +177,11 @@ class IC { |
static inline void SetTargetAtAddress(Address address, Code* target); |
static void PostPatching(Address address, Code* target, Code* old_target); |
+ bool HandleLoad(State state, |
+ Handle<Object> object, |
+ Handle<String> name, |
+ MaybeObject** result); |
+ |
private: |
// Frame pointer for the frame that uses (calls) the IC. |
Address fp_; |
@@ -338,10 +355,15 @@ class LoadIC: public IC { |
// Specialized code generator routines. |
static void GenerateArrayLength(MacroAssembler* masm); |
- static void GenerateStringLength(MacroAssembler* masm, |
- bool support_wrappers); |
static void GenerateFunctionPrototype(MacroAssembler* masm); |
+ protected: |
+ virtual Code::Kind kind() const { return Code::LOAD_IC; } |
+ |
+ virtual Handle<Code> megamorphic_stub() { |
+ return isolate()->builtins()->LoadIC_Megamorphic(); |
+ } |
+ |
private: |
// Update the inline cache and the global stub cache based on the |
// lookup result. |
@@ -351,14 +373,11 @@ class LoadIC: public IC { |
Handle<String> name); |
// Stub accessors. |
- Handle<Code> megamorphic_stub() { |
- return isolate()->builtins()->LoadIC_Megamorphic(); |
- } |
static Code* initialize_stub() { |
return Isolate::Current()->builtins()->builtin( |
Builtins::kLoadIC_Initialize); |
} |
- Handle<Code> pre_monomorphic_stub() { |
+ virtual Handle<Code> pre_monomorphic_stub() { |
return isolate()->builtins()->LoadIC_PreMonomorphic(); |
} |
@@ -429,8 +448,6 @@ class KeyedIC: public IC { |
return Handle<Code>::null(); |
} |
- virtual Code::Kind kind() const = 0; |
- |
Handle<Code> ComputeStub(Handle<JSObject> receiver, |
StubKind stub_kind, |
StrictModeFlag strict_mode, |
@@ -520,6 +537,10 @@ class KeyedLoadIC: public KeyedIC { |
protected: |
virtual Code::Kind kind() const { return Code::KEYED_LOAD_IC; } |
+ virtual Handle<Code> megamorphic_stub() { |
+ return isolate()->builtins()->KeyedLoadIC_Generic(); |
+ } |
+ |
virtual Handle<Code> ComputePolymorphicStub(MapHandleList* receiver_maps, |
StrictModeFlag strict_mode, |
KeyedAccessGrowMode grow_mode); |
@@ -540,13 +561,10 @@ class KeyedLoadIC: public KeyedIC { |
return Isolate::Current()->builtins()->builtin( |
Builtins::kKeyedLoadIC_Initialize); |
} |
- Handle<Code> megamorphic_stub() { |
- return isolate()->builtins()->KeyedLoadIC_Generic(); |
- } |
Handle<Code> generic_stub() const { |
return isolate()->builtins()->KeyedLoadIC_Generic(); |
} |
- Handle<Code> pre_monomorphic_stub() { |
+ virtual Handle<Code> pre_monomorphic_stub() { |
return isolate()->builtins()->KeyedLoadIC_PreMonomorphic(); |
} |
Handle<Code> indexed_interceptor_stub() { |
@@ -584,6 +602,12 @@ class StoreIC: public IC { |
static void GenerateGlobalProxy(MacroAssembler* masm, |
StrictModeFlag strict_mode); |
+ protected: |
+ virtual Code::Kind kind() const { return Code::STORE_IC; } |
+ virtual Handle<Code> megamorphic_stub() { |
+ return isolate()->builtins()->StoreIC_Megamorphic(); |
+ } |
+ |
private: |
// Update the inline cache and the global stub cache based on the |
// lookup result. |
@@ -602,10 +626,6 @@ class StoreIC: public IC { |
} |
// Stub accessors. |
- Code* megamorphic_stub() { |
- return isolate()->builtins()->builtin( |
- Builtins::kStoreIC_Megamorphic); |
- } |
Code* megamorphic_stub_strict() { |
return isolate()->builtins()->builtin( |
Builtins::kStoreIC_Megamorphic_Strict); |