Index: src/ic.h |
diff --git a/src/ic.h b/src/ic.h |
index c95f2e3c8dc314684378d3fcded1058ff1edcc06..784512a1c49f8b2f421495dc93cee5d1a1fafadb 100644 |
--- a/src/ic.h |
+++ b/src/ic.h |
@@ -136,6 +136,15 @@ class IC { |
Handle<Object> object, |
Handle<String> name); |
+ MUST_USE_RESULT MaybeObject* Store( |
+ State state, |
+ StrictModeFlag strict_mode, |
+ Handle<Object> object, |
+ Handle<String> name, |
+ Handle<Object> value, |
+ JSReceiver::StoreFromKeyed store_mode = |
+ JSReceiver::CERTAINLY_NOT_STORE_FROM_KEYED); |
+ |
protected: |
virtual Handle<Code> pre_monomorphic_stub() { |
UNREACHABLE(); |
@@ -145,6 +154,10 @@ class IC { |
UNREACHABLE(); |
return Handle<Code>::null(); |
} |
+ virtual Handle<Code> megamorphic_stub_strict() { |
+ UNREACHABLE(); |
+ return Handle<Code>::null(); |
+ } |
virtual Handle<Code> generic_stub() const { |
UNREACHABLE(); |
return Handle<Code>::null(); |
@@ -153,12 +166,29 @@ class IC { |
UNREACHABLE(); |
return Code::STUB; |
} |
+ virtual Handle<Code> global_proxy_stub() { |
+ UNREACHABLE(); |
+ return Handle<Code>::null(); |
+ } |
+ virtual Handle<Code> global_proxy_stub_strict() { |
+ UNREACHABLE(); |
+ return Handle<Code>::null(); |
+ } |
+ |
virtual void UpdateLoadCaches(LookupResult* lookup, |
State state, |
Handle<Object> object, |
Handle<String> name) { |
UNREACHABLE(); |
} |
+ virtual void UpdateStoreCaches(LookupResult* lookup, |
+ State state, |
+ StrictModeFlag strict_mode, |
+ Handle<JSObject> receiver, |
+ Handle<String> name, |
+ Handle<Object> value) { |
+ UNREACHABLE(); |
+ } |
Address fp() const { return fp_; } |
Address pc() const { return *pc_address_; } |
Isolate* isolate() const { return isolate_; } |
@@ -378,9 +408,8 @@ class LoadIC: public IC { |
private: |
// Stub accessors. |
- static Code* initialize_stub() { |
- return Isolate::Current()->builtins()->builtin( |
- Builtins::kLoadIC_Initialize); |
+ static Handle<Code> initialize_stub() { |
+ return Isolate::Current()->builtins()->LoadIC_Initialize(); |
} |
virtual Handle<Code> pre_monomorphic_stub() { |
return isolate()->builtins()->LoadIC_PreMonomorphic(); |
@@ -565,9 +594,8 @@ class KeyedLoadIC: public KeyedIC { |
private: |
// Stub accessors. |
- static Code* initialize_stub() { |
- return Isolate::Current()->builtins()->builtin( |
- Builtins::kKeyedLoadIC_Initialize); |
+ static Handle<Code> initialize_stub() { |
+ return Isolate::Current()->builtins()->KeyedLoadIC_Initialize(); |
} |
virtual Handle<Code> pre_monomorphic_stub() { |
return isolate()->builtins()->KeyedLoadIC_PreMonomorphic(); |
@@ -591,12 +619,6 @@ class StoreIC: public IC { |
ASSERT(target()->is_store_stub()); |
} |
- MUST_USE_RESULT MaybeObject* Store(State state, |
- StrictModeFlag strict_mode, |
- Handle<Object> object, |
- Handle<String> name, |
- Handle<Object> value); |
- |
// Code generators for stub routines. Only called once at startup. |
static void GenerateInitialize(MacroAssembler* masm) { GenerateMiss(masm); } |
static void GenerateMiss(MacroAssembler* masm); |
@@ -612,17 +634,28 @@ class StoreIC: public IC { |
virtual Handle<Code> megamorphic_stub() { |
return isolate()->builtins()->StoreIC_Megamorphic(); |
} |
+ // Stub accessors. |
+ virtual Handle<Code> megamorphic_stub_strict() { |
+ return isolate()->builtins()->StoreIC_Megamorphic_Strict(); |
+ } |
+ virtual Handle<Code> global_proxy_stub() { |
+ return isolate()->builtins()->StoreIC_GlobalProxy(); |
+ } |
+ virtual Handle<Code> global_proxy_stub_strict() { |
+ return isolate()->builtins()->StoreIC_GlobalProxy_Strict(); |
+ } |
+ |
- private: |
// Update the inline cache and the global stub cache based on the |
// lookup result. |
- void UpdateCaches(LookupResult* lookup, |
- State state, |
- StrictModeFlag strict_mode, |
- Handle<JSObject> receiver, |
- Handle<String> name, |
- Handle<Object> value); |
+ virtual void UpdateStoreCaches(LookupResult* lookup, |
+ State state, |
+ StrictModeFlag strict_mode, |
+ Handle<JSObject> receiver, |
+ Handle<String> name, |
+ Handle<Object> value); |
+ private: |
void set_target(Code* code) { |
// Strict mode must be preserved across IC patching. |
ASSERT(Code::GetStrictMode(code->extra_ic_state()) == |
@@ -630,26 +663,12 @@ class StoreIC: public IC { |
IC::set_target(code); |
} |
- // Stub accessors. |
- Code* megamorphic_stub_strict() { |
- return isolate()->builtins()->builtin( |
- Builtins::kStoreIC_Megamorphic_Strict); |
- } |
- static Code* initialize_stub() { |
- return Isolate::Current()->builtins()->builtin( |
- Builtins::kStoreIC_Initialize); |
+ static Handle<Code> initialize_stub() { |
+ return Isolate::Current()->builtins()->StoreIC_Initialize(); |
} |
- static Code* initialize_stub_strict() { |
- return Isolate::Current()->builtins()->builtin( |
- Builtins::kStoreIC_Initialize_Strict); |
+ static Handle<Code> initialize_stub_strict() { |
+ return Isolate::Current()->builtins()->StoreIC_Initialize_Strict(); |
} |
- Handle<Code> global_proxy_stub() { |
- return isolate()->builtins()->StoreIC_GlobalProxy(); |
- } |
- Handle<Code> global_proxy_stub_strict() { |
- return isolate()->builtins()->StoreIC_GlobalProxy_Strict(); |
- } |
- |
static void Clear(Address address, Code* target); |
friend class IC; |
@@ -706,15 +725,22 @@ class KeyedStoreIC: public KeyedIC { |
StrictModeFlag strict_mode, |
KeyedAccessGrowMode grow_mode); |
- private: |
// Update the inline cache. |
- void UpdateCaches(LookupResult* lookup, |
- State state, |
- StrictModeFlag strict_mode, |
- Handle<JSObject> receiver, |
- Handle<String> name, |
- Handle<Object> value); |
+ virtual void UpdateStoreCaches(LookupResult* lookup, |
+ State state, |
+ StrictModeFlag strict_mode, |
+ Handle<JSObject> receiver, |
+ Handle<String> name, |
+ Handle<Object> value); |
+ |
+ virtual Handle<Code> megamorphic_stub() { |
+ return isolate()->builtins()->KeyedStoreIC_Generic(); |
+ } |
+ virtual Handle<Code> megamorphic_stub_strict() { |
+ return isolate()->builtins()->KeyedStoreIC_Generic_Strict(); |
+ } |
+ private: |
void set_target(Code* code) { |
// Strict mode must be preserved across IC patching. |
ASSERT(Code::GetStrictMode(code->extra_ic_state()) == |
@@ -723,19 +749,11 @@ class KeyedStoreIC: public KeyedIC { |
} |
// Stub accessors. |
- static Code* initialize_stub() { |
- return Isolate::Current()->builtins()->builtin( |
- Builtins::kKeyedStoreIC_Initialize); |
- } |
- static Code* initialize_stub_strict() { |
- return Isolate::Current()->builtins()->builtin( |
- Builtins::kKeyedStoreIC_Initialize_Strict); |
+ static Handle<Code> initialize_stub() { |
+ return Isolate::Current()->builtins()->KeyedStoreIC_Initialize(); |
} |
- Handle<Code> megamorphic_stub() { |
- return isolate()->builtins()->KeyedStoreIC_Generic(); |
- } |
- Handle<Code> megamorphic_stub_strict() { |
- return isolate()->builtins()->KeyedStoreIC_Generic_Strict(); |
+ static Handle<Code> initialize_stub_strict() { |
+ return Isolate::Current()->builtins()->KeyedStoreIC_Initialize_Strict(); |
} |
Handle<Code> generic_stub() const { |
return isolate()->builtins()->KeyedStoreIC_Generic(); |