Chromium Code Reviews| Index: src/ic.h |
| diff --git a/src/ic.h b/src/ic.h |
| index 91b07f41e30ff3bfd38cfe6e5a1edec033ec4da5..bc5c38cb7c7fcd17e15cbf3a986693a5fb9b0ff8 100644 |
| --- a/src/ic.h |
| +++ b/src/ic.h |
| @@ -174,19 +174,16 @@ class IC { |
| void UpdateMonomorphicIC(Handle<HeapObject> receiver, |
| Handle<Code> handler, |
| - Handle<String> name, |
| - StrictModeFlag strict_mode); |
| + Handle<String> name); |
| bool UpdatePolymorphicIC(State state, |
| Handle<HeapObject> receiver, |
| Handle<String> name, |
| - Handle<Code> code, |
| - StrictModeFlag strict_mode); |
| + Handle<Code> code); |
| void CopyICToMegamorphicCache(Handle<String> name); |
| bool IsTransitionedMapOfMonomorphicTarget(Map* receiver_map); |
| void PatchCache(State state, |
| - StrictModeFlag strict_mode, |
| Handle<HeapObject> receiver, |
| Handle<String> name, |
| Handle<Code> code); |
| @@ -195,18 +192,11 @@ 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(); |
| } |
| - virtual Handle<Code> generic_stub_strict() const { |
| - UNREACHABLE(); |
| - return Handle<Code>::null(); |
| - } |
| + virtual StrictModeFlag strict_mode() const { return kNonStrictMode; } |
| private: |
| // Frame pointer for the frame that uses (calls) the IC. |
| @@ -407,9 +397,11 @@ class LoadIC: public IC { |
| static Handle<Code> initialize_stub(Isolate* isolate) { |
| return isolate->builtins()->LoadIC_Initialize(); |
| } |
| + |
| static Handle<Code> pre_monomorphic_stub(Isolate* isolate) { |
| return isolate->builtins()->LoadIC_PreMonomorphic(); |
| } |
| + |
| virtual Handle<Code> pre_monomorphic_stub() { |
| return pre_monomorphic_stub(isolate()); |
| } |
| @@ -509,10 +501,14 @@ class KeyedLoadIC: public LoadIC { |
| class StoreIC: public IC { |
| public: |
| - StoreIC(FrameDepth depth, Isolate* isolate) : IC(depth, isolate) { |
| + StoreIC(FrameDepth depth, Isolate* isolate) |
| + : IC(depth, isolate), |
| + strict_mode_(Code::GetStrictMode(target()->extra_ic_state())) { |
| ASSERT(target()->is_store_stub() || target()->is_keyed_store_stub()); |
| } |
| + virtual StrictModeFlag strict_mode() const { return strict_mode_; } |
| + |
| // Code generators for stub routines. Only called once at startup. |
| static void GenerateSlow(MacroAssembler* masm); |
| static void GenerateInitialize(MacroAssembler* masm) { GenerateMiss(masm); } |
| @@ -528,7 +524,6 @@ class StoreIC: public IC { |
| MUST_USE_RESULT MaybeObject* Store( |
| State state, |
| - StrictModeFlag strict_mode, |
| Handle<Object> object, |
| Handle<String> name, |
| Handle<Object> value, |
| @@ -538,42 +533,46 @@ class StoreIC: public IC { |
| protected: |
| virtual Code::Kind kind() const { return Code::STORE_IC; } |
| virtual Handle<Code> megamorphic_stub() { |
| - return isolate()->builtins()->StoreIC_Megamorphic(); |
| + if (strict_mode_ == kStrictMode) { |
| + return isolate()->builtins()->StoreIC_Megamorphic_Strict(); |
| + } else { |
| + return isolate()->builtins()->StoreIC_Megamorphic(); |
| + } |
| } |
| // Stub accessors. |
| - virtual Handle<Code> megamorphic_stub_strict() { |
| - return isolate()->builtins()->StoreIC_Megamorphic_Strict(); |
| - } |
| virtual Handle<Code> generic_stub() const { |
| - return isolate()->builtins()->StoreIC_Generic(); |
| - } |
| - virtual Handle<Code> generic_stub_strict() const { |
| - return isolate()->builtins()->StoreIC_Generic_Strict(); |
| + if (strict_mode() == kStrictMode) { |
|
ulan
2013/10/01 08:38:43
Let's use strict_mode_ to be consistent with other
|
| + return isolate()->builtins()->StoreIC_Generic_Strict(); |
| + } else { |
| + return isolate()->builtins()->StoreIC_Generic(); |
| + } |
| } |
| + |
| virtual Handle<Code> pre_monomorphic_stub() { |
| - return pre_monomorphic_stub(isolate()); |
| - } |
| - static Handle<Code> pre_monomorphic_stub(Isolate* isolate) { |
| - return isolate->builtins()->StoreIC_PreMonomorphic(); |
| - } |
| - virtual Handle<Code> pre_monomorphic_stub_strict() { |
| - return pre_monomorphic_stub_strict(isolate()); |
| + return pre_monomorphic_stub(isolate(), strict_mode()); |
| } |
| - static Handle<Code> pre_monomorphic_stub_strict(Isolate* isolate) { |
| - return isolate->builtins()->StoreIC_PreMonomorphic_Strict(); |
| + |
| + static Handle<Code> pre_monomorphic_stub(Isolate* isolate, |
| + StrictModeFlag strict_mode) { |
| + if (strict_mode == kStrictMode) { |
| + return isolate->builtins()->StoreIC_PreMonomorphic_Strict(); |
| + } else { |
| + return isolate->builtins()->StoreIC_PreMonomorphic(); |
| + } |
| } |
| + |
| virtual Handle<Code> global_proxy_stub() { |
| - return isolate()->builtins()->StoreIC_GlobalProxy(); |
| - } |
| - virtual Handle<Code> global_proxy_stub_strict() { |
| - return isolate()->builtins()->StoreIC_GlobalProxy_Strict(); |
| + if (strict_mode_ == kStrictMode) { |
| + return isolate()->builtins()->StoreIC_GlobalProxy_Strict(); |
| + } else { |
| + return isolate()->builtins()->StoreIC_GlobalProxy(); |
| + } |
| } |
| // 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); |
| @@ -581,7 +580,6 @@ class StoreIC: public IC { |
| // monomorphic state and making sure that the code stub is in the |
| // stub cache. |
| virtual Handle<Code> ComputeStoreMonomorphic(LookupResult* lookup, |
| - StrictModeFlag strict_mode, |
| Handle<JSObject> receiver, |
| Handle<String> name, |
| Handle<Object> value); |
| @@ -594,14 +592,19 @@ class StoreIC: public IC { |
| IC::set_target(code); |
| } |
| - static Handle<Code> initialize_stub(Isolate* isolate) { |
| - return isolate->builtins()->StoreIC_Initialize(); |
| - } |
| - static Handle<Code> initialize_stub_strict(Isolate* isolate) { |
| - return isolate->builtins()->StoreIC_Initialize_Strict(); |
| + static Handle<Code> initialize_stub(Isolate* isolate, |
| + StrictModeFlag strict_mode) { |
| + if (strict_mode == kStrictMode) { |
| + return isolate->builtins()->StoreIC_Initialize_Strict(); |
| + } else { |
| + return isolate->builtins()->StoreIC_Initialize(); |
| + } |
| } |
| + |
| static void Clear(Isolate* isolate, Address address, Code* target); |
| + StrictModeFlag strict_mode_; |
| + |
| friend class IC; |
| }; |
| @@ -626,7 +629,6 @@ class KeyedStoreIC: public StoreIC { |
| } |
| MUST_USE_RESULT MaybeObject* Store(State state, |
| - StrictModeFlag strict_mode, |
| Handle<Object> object, |
| Handle<Object> name, |
| Handle<Object> value, |
| @@ -650,56 +652,58 @@ class KeyedStoreIC: public StoreIC { |
| virtual Code::Kind kind() const { return Code::KEYED_STORE_IC; } |
| virtual Handle<Code> ComputeStoreMonomorphic(LookupResult* lookup, |
| - StrictModeFlag strict_mode, |
| Handle<JSObject> receiver, |
| Handle<String> name, |
| Handle<Object> value); |
| virtual void UpdateMegamorphicCache(Map* map, Name* name, Code* code) { } |
| virtual Handle<Code> pre_monomorphic_stub() { |
| - return pre_monomorphic_stub(isolate()); |
| + return pre_monomorphic_stub(isolate(), strict_mode()); |
| } |
| - static Handle<Code> pre_monomorphic_stub(Isolate* isolate) { |
| - return isolate->builtins()->KeyedStoreIC_PreMonomorphic(); |
| - } |
| - virtual Handle<Code> pre_monomorphic_stub_strict() { |
| - return pre_monomorphic_stub_strict(isolate()); |
| - } |
| - static Handle<Code> pre_monomorphic_stub_strict(Isolate* isolate) { |
| - return isolate->builtins()->KeyedStoreIC_PreMonomorphic_Strict(); |
| + static Handle<Code> pre_monomorphic_stub(Isolate* isolate, |
| + StrictModeFlag strict_mode) { |
| + if (strict_mode == kStrictMode) { |
| + return isolate->builtins()->KeyedStoreIC_PreMonomorphic_Strict(); |
| + } else { |
| + return isolate->builtins()->KeyedStoreIC_PreMonomorphic(); |
| + } |
| } |
| virtual Handle<Code> megamorphic_stub() { |
| - return isolate()->builtins()->KeyedStoreIC_Generic(); |
| - } |
| - virtual Handle<Code> megamorphic_stub_strict() { |
| - return isolate()->builtins()->KeyedStoreIC_Generic_Strict(); |
| + if (strict_mode() == kStrictMode) { |
| + return isolate()->builtins()->KeyedStoreIC_Generic_Strict(); |
| + } else { |
| + return isolate()->builtins()->KeyedStoreIC_Generic(); |
| + } |
| } |
| Handle<Code> StoreElementStub(Handle<JSObject> receiver, |
| - KeyedAccessStoreMode store_mode, |
| - StrictModeFlag strict_mode); |
| + KeyedAccessStoreMode store_mode); |
| private: |
| void set_target(Code* code) { |
| // Strict mode must be preserved across IC patching. |
| - ASSERT(Code::GetStrictMode(code->extra_ic_state()) == |
| - Code::GetStrictMode(target()->extra_ic_state())); |
| + ASSERT(Code::GetStrictMode(code->extra_ic_state()) == strict_mode()); |
| IC::set_target(code); |
| } |
| // Stub accessors. |
| - static Handle<Code> initialize_stub(Isolate* isolate) { |
| - return isolate->builtins()->KeyedStoreIC_Initialize(); |
| - } |
| - static Handle<Code> initialize_stub_strict(Isolate* isolate) { |
| - return isolate->builtins()->KeyedStoreIC_Initialize_Strict(); |
| - } |
| - Handle<Code> generic_stub() const { |
| - return isolate()->builtins()->KeyedStoreIC_Generic(); |
| + static Handle<Code> initialize_stub(Isolate* isolate, |
| + StrictModeFlag strict_mode) { |
| + if (strict_mode == kStrictMode) { |
| + return isolate->builtins()->KeyedStoreIC_Initialize_Strict(); |
| + } else { |
| + return isolate->builtins()->KeyedStoreIC_Initialize(); |
| + } |
| } |
| - Handle<Code> generic_stub_strict() const { |
| - return isolate()->builtins()->KeyedStoreIC_Generic_Strict(); |
| + |
| + virtual Handle<Code> generic_stub() const { |
| + if (strict_mode() == kStrictMode) { |
| + return isolate()->builtins()->KeyedStoreIC_Generic_Strict(); |
| + } else { |
| + return isolate()->builtins()->KeyedStoreIC_Generic(); |
| + } |
| } |
| + |
| Handle<Code> non_strict_arguments_stub() { |
| return isolate()->builtins()->KeyedStoreIC_NonStrictArguments(); |
| } |