Index: src/stub-cache.h |
diff --git a/src/stub-cache.h b/src/stub-cache.h |
index ae0c65d57748f12a97b22f91085e268f11bb3e25..38bc7a3c3a6fff69ccaddde91bdca75cf019bb49 100644 |
--- a/src/stub-cache.h |
+++ b/src/stub-cache.h |
@@ -105,39 +105,6 @@ class StubCache { |
Handle<Code> ComputeLoadNonexistent(Handle<Name> name, |
Handle<JSObject> object); |
- Handle<Code> ComputeLoadField(Handle<Name> name, |
- Handle<JSObject> object, |
- Handle<JSObject> holder, |
- PropertyIndex field_index, |
- Representation representation); |
- |
- Handle<Code> ComputeLoadCallback(Handle<Name> name, |
- Handle<JSObject> object, |
- Handle<JSObject> holder, |
- Handle<ExecutableAccessorInfo> callback); |
- |
- Handle<Code> ComputeLoadCallback(Handle<Name> name, |
- Handle<JSObject> object, |
- Handle<JSObject> holder, |
- const CallOptimization& call_optimization); |
- |
- Handle<Code> ComputeLoadViaGetter(Handle<Name> name, |
- Handle<JSObject> object, |
- Handle<JSObject> holder, |
- Handle<JSFunction> getter); |
- |
- Handle<Code> ComputeLoadConstant(Handle<Name> name, |
- Handle<JSObject> object, |
- Handle<JSObject> holder, |
- Handle<Object> value); |
- |
- Handle<Code> ComputeLoadInterceptor(Handle<Name> name, |
- Handle<JSObject> object, |
- Handle<JSObject> holder); |
- |
- Handle<Code> ComputeLoadNormal(Handle<Name> name, |
- Handle<JSObject> object); |
- |
Handle<Code> ComputeLoadGlobal(Handle<Name> name, |
Handle<JSObject> object, |
Handle<GlobalObject> holder, |
@@ -173,69 +140,18 @@ class StubCache { |
Handle<JSObject> object, |
Handle<JSObject> holder); |
- // --- |
- |
- Handle<Code> ComputeStoreField(Handle<Name> name, |
- Handle<JSObject> object, |
- LookupResult* lookup, |
- StrictModeFlag strict_mode); |
- |
- Handle<Code> ComputeStoreTransition(Handle<Name> name, |
- Handle<JSObject> object, |
- LookupResult* lookup, |
- Handle<Map> transition, |
- StrictModeFlag strict_mode); |
- |
- Handle<Code> ComputeStoreNormal(StrictModeFlag strict_mode); |
- |
Handle<Code> ComputeStoreGlobal(Handle<Name> name, |
Handle<GlobalObject> object, |
Handle<PropertyCell> cell, |
Handle<Object> value, |
StrictModeFlag strict_mode); |
- Handle<Code> ComputeStoreCallback(Handle<Name> name, |
- Handle<JSObject> object, |
- Handle<JSObject> holder, |
- Handle<ExecutableAccessorInfo> callback, |
- StrictModeFlag strict_mode); |
- |
- Handle<Code> ComputeStoreCallback(Handle<Name> name, |
- Handle<JSObject> object, |
- Handle<JSObject> holder, |
- const CallOptimization& call_optimation, |
- StrictModeFlag strict_mode); |
- |
- Handle<Code> ComputeStoreViaSetter(Handle<Name> name, |
- Handle<JSObject> object, |
- Handle<JSObject> holder, |
- Handle<JSFunction> setter, |
- StrictModeFlag strict_mode); |
- |
- Handle<Code> ComputeStoreInterceptor(Handle<Name> name, |
- Handle<JSObject> object, |
- StrictModeFlag strict_mode); |
- |
- // --- |
- |
- Handle<Code> ComputeKeyedStoreField(Handle<Name> name, |
- Handle<JSObject> object, |
- LookupResult* lookup, |
- StrictModeFlag strict_mode); |
- Handle<Code> ComputeKeyedStoreTransition(Handle<Name> name, |
- Handle<JSObject> object, |
- LookupResult* lookup, |
- Handle<Map> transition, |
- StrictModeFlag strict_mode); |
- |
Handle<Code> ComputeKeyedLoadElement(Handle<Map> receiver_map); |
Handle<Code> ComputeKeyedStoreElement(Handle<Map> receiver_map, |
StrictModeFlag strict_mode, |
KeyedAccessStoreMode store_mode); |
- // --- |
- |
Handle<Code> ComputeCallField(int argc, |
Code::Kind, |
Code::ExtraICState extra_state, |
@@ -624,8 +540,10 @@ enum FrontendCheckType { PERFORM_INITIAL_CHECKS, SKIP_INITIAL_CHECKS }; |
class BaseLoadStoreStubCompiler: public StubCompiler { |
public: |
- BaseLoadStoreStubCompiler(Isolate* isolate, Register* registers) |
- : StubCompiler(isolate), registers_(registers) { } |
+ BaseLoadStoreStubCompiler(Isolate* isolate, Code::Kind kind) |
+ : StubCompiler(isolate), kind_(kind) { |
+ InitializeRegisters(); |
+ } |
virtual ~BaseLoadStoreStubCompiler() { } |
Handle<Code> CompileMonomorphicIC(Handle<Map> receiver_map, |
@@ -678,26 +596,45 @@ class BaseLoadStoreStubCompiler: public StubCompiler { |
Code::StubType type, |
Handle<Name> name, |
InlineCacheState state = MONOMORPHIC); |
+ Code::Kind kind() { return kind_; } |
+ |
+ Logger::LogEventsAndTags log_kind(Handle<Code> code) { |
+ if (!code->is_inline_cache_stub()) return Logger::STUB_TAG; |
+ if (kind_ == Code::LOAD_IC) { |
+ return code->ic_state() == MONOMORPHIC |
+ ? Logger::LOAD_IC_TAG : Logger::LOAD_POLYMORPHIC_IC_TAG; |
+ } else if (kind_ == Code::KEYED_LOAD_IC) { |
+ return code->ic_state() == MONOMORPHIC |
+ ? Logger::KEYED_LOAD_IC_TAG : Logger::KEYED_LOAD_POLYMORPHIC_IC_TAG; |
+ } else if (kind_ == Code::STORE_IC) { |
+ return code->ic_state() == MONOMORPHIC |
+ ? Logger::STORE_IC_TAG : Logger::STORE_POLYMORPHIC_IC_TAG; |
+ } else { |
+ return code->ic_state() == MONOMORPHIC |
+ ? Logger::KEYED_STORE_IC_TAG : Logger::KEYED_STORE_POLYMORPHIC_IC_TAG; |
+ } |
+ } |
+ void JitEvent(Handle<Name> name, Handle<Code> code); |
virtual Code::ExtraICState extra_state() { return Code::kNoExtraICState; } |
- virtual Logger::LogEventsAndTags log_kind(Handle<Code> code) = 0; |
- virtual void JitEvent(Handle<Name> name, Handle<Code> code) = 0; |
- virtual Code::Kind kind() = 0; |
virtual Register receiver() = 0; |
virtual Register name() = 0; |
virtual Register scratch1() = 0; |
virtual Register scratch2() = 0; |
virtual Register scratch3() = 0; |
+ void InitializeRegisters(); |
+ |
+ Code::Kind kind_; |
Register* registers_; |
}; |
-class BaseLoadStubCompiler: public BaseLoadStoreStubCompiler { |
+class LoadStubCompiler: public BaseLoadStoreStubCompiler { |
public: |
- BaseLoadStubCompiler(Isolate* isolate, Register* registers) |
- : BaseLoadStoreStubCompiler(isolate, registers) { } |
- virtual ~BaseLoadStubCompiler() { } |
+ LoadStubCompiler(Isolate* isolate, Code::Kind kind = Code::LOAD_IC) |
+ : BaseLoadStoreStubCompiler(isolate, kind) { } |
+ virtual ~LoadStubCompiler() { } |
Handle<Code> CompileLoadField(Handle<JSObject> object, |
Handle<JSObject> holder, |
@@ -724,6 +661,28 @@ class BaseLoadStubCompiler: public BaseLoadStoreStubCompiler { |
Handle<JSObject> holder, |
Handle<Name> name); |
+ Handle<Code> CompileLoadViaGetter(Handle<JSObject> object, |
+ Handle<JSObject> holder, |
+ Handle<Name> name, |
+ Handle<JSFunction> getter); |
+ |
+ static void GenerateLoadViaGetter(MacroAssembler* masm, |
+ Register receiver, |
+ Handle<JSFunction> getter); |
+ |
+ Handle<Code> CompileLoadNonexistent(Handle<JSObject> object, |
+ Handle<JSObject> last, |
+ Handle<Name> name, |
+ Handle<GlobalObject> global); |
+ |
+ Handle<Code> CompileLoadGlobal(Handle<JSObject> object, |
+ Handle<GlobalObject> holder, |
+ Handle<PropertyCell> cell, |
+ Handle<Name> name, |
+ bool is_dont_delete); |
+ |
+ static Register* registers(); |
+ |
protected: |
virtual Register HandlerFrontendHeader(Handle<JSObject> object, |
Register object_reg, |
@@ -774,46 +733,10 @@ class BaseLoadStubCompiler: public BaseLoadStoreStubCompiler { |
}; |
-class LoadStubCompiler: public BaseLoadStubCompiler { |
- public: |
- explicit LoadStubCompiler(Isolate* isolate) |
- : BaseLoadStubCompiler(isolate, registers()) { } |
- |
- Handle<Code> CompileLoadNonexistent(Handle<JSObject> object, |
- Handle<JSObject> last, |
- Handle<Name> name, |
- Handle<GlobalObject> global); |
- |
- static void GenerateLoadViaGetter(MacroAssembler* masm, |
- Handle<JSFunction> getter); |
- |
- Handle<Code> CompileLoadViaGetter(Handle<JSObject> object, |
- Handle<JSObject> holder, |
- Handle<Name> name, |
- Handle<JSFunction> getter); |
- |
- Handle<Code> CompileLoadGlobal(Handle<JSObject> object, |
- Handle<GlobalObject> holder, |
- Handle<PropertyCell> cell, |
- Handle<Name> name, |
- bool is_dont_delete); |
- |
- private: |
- static Register* registers(); |
- virtual Code::Kind kind() { return Code::LOAD_IC; } |
- virtual Logger::LogEventsAndTags log_kind(Handle<Code> code) { |
- if (!code->is_inline_cache_stub()) return Logger::STUB_TAG; |
- return code->ic_state() == MONOMORPHIC |
- ? Logger::LOAD_IC_TAG : Logger::LOAD_POLYMORPHIC_IC_TAG; |
- } |
- virtual void JitEvent(Handle<Name> name, Handle<Code> code); |
-}; |
- |
- |
-class KeyedLoadStubCompiler: public BaseLoadStubCompiler { |
+class KeyedLoadStubCompiler: public LoadStubCompiler { |
public: |
explicit KeyedLoadStubCompiler(Isolate* isolate) |
- : BaseLoadStubCompiler(isolate, registers()) { } |
+ : LoadStubCompiler(isolate, Code::KEYED_LOAD_IC) { } |
Handle<Code> CompileLoadElement(Handle<Map> receiver_map); |
@@ -822,30 +745,26 @@ class KeyedLoadStubCompiler: public BaseLoadStubCompiler { |
static void GenerateLoadDictionaryElement(MacroAssembler* masm); |
- private: |
+ protected: |
static Register* registers(); |
- virtual Code::Kind kind() { return Code::KEYED_LOAD_IC; } |
- virtual Logger::LogEventsAndTags log_kind(Handle<Code> code) { |
- if (!code->is_inline_cache_stub()) return Logger::STUB_TAG; |
- return code->ic_state() == MONOMORPHIC |
- ? Logger::KEYED_LOAD_IC_TAG : Logger::KEYED_LOAD_POLYMORPHIC_IC_TAG; |
- } |
- virtual void JitEvent(Handle<Name> name, Handle<Code> code); |
+ |
+ private: |
virtual void GenerateNameCheck(Handle<Name> name, |
Register name_reg, |
Label* miss); |
+ friend class BaseLoadStoreStubCompiler; |
}; |
-class BaseStoreStubCompiler: public BaseLoadStoreStubCompiler { |
+class StoreStubCompiler: public BaseLoadStoreStubCompiler { |
public: |
- BaseStoreStubCompiler(Isolate* isolate, |
- StrictModeFlag strict_mode, |
- Register* registers) |
- : BaseLoadStoreStubCompiler(isolate, registers), |
+ StoreStubCompiler(Isolate* isolate, |
+ StrictModeFlag strict_mode, |
+ Code::Kind kind = Code::STORE_IC) |
+ : BaseLoadStoreStubCompiler(isolate, kind), |
strict_mode_(strict_mode) { } |
- virtual ~BaseStoreStubCompiler() { } |
+ virtual ~StoreStubCompiler() { } |
Handle<Code> CompileStoreTransition(Handle<JSObject> object, |
LookupResult* lookup, |
@@ -886,16 +805,27 @@ class BaseStoreStubCompiler: public BaseLoadStoreStubCompiler { |
Register scratch2, |
Label* miss_label); |
- static Builtins::Name MissBuiltin(Code::Kind kind) { |
- switch (kind) { |
- case Code::LOAD_IC: return Builtins::kLoadIC_Miss; |
- case Code::STORE_IC: return Builtins::kStoreIC_Miss; |
- case Code::KEYED_LOAD_IC: return Builtins::kKeyedLoadIC_Miss; |
- case Code::KEYED_STORE_IC: return Builtins::kKeyedStoreIC_Miss; |
- default: UNREACHABLE(); |
- } |
- return Builtins::kLoadIC_Miss; |
- } |
+ Handle<Code> CompileStoreCallback(Handle<JSObject> object, |
+ Handle<JSObject> holder, |
+ Handle<Name> name, |
+ Handle<ExecutableAccessorInfo> callback); |
+ |
+ Handle<Code> CompileStoreCallback(Handle<JSObject> object, |
+ Handle<JSObject> holder, |
+ Handle<Name> name, |
+ const CallOptimization& call_optimization); |
+ |
+ static void GenerateStoreViaSetter(MacroAssembler* masm, |
+ Handle<JSFunction> setter); |
+ |
+ Handle<Code> CompileStoreViaSetter(Handle<JSObject> object, |
+ Handle<JSObject> holder, |
+ Handle<Name> name, |
+ Handle<JSFunction> setter); |
+ |
+ Handle<Code> CompileStoreInterceptor(Handle<JSObject> object, |
+ Handle<Name> name); |
+ |
static Builtins::Name SlowBuiltin(Code::Kind kind) { |
switch (kind) { |
case Code::STORE_IC: return Builtins::kStoreIC_Slow; |
@@ -928,56 +858,21 @@ class BaseStoreStubCompiler: public BaseLoadStoreStubCompiler { |
StrictModeFlag strict_mode() { return strict_mode_; } |
virtual Code::ExtraICState extra_state() { return strict_mode_; } |
- private: |
- StrictModeFlag strict_mode_; |
-}; |
- |
- |
-class StoreStubCompiler: public BaseStoreStubCompiler { |
- public: |
- StoreStubCompiler(Isolate* isolate, StrictModeFlag strict_mode) |
- : BaseStoreStubCompiler(isolate, strict_mode, registers()) { } |
- |
- |
- Handle<Code> CompileStoreCallback(Handle<JSObject> object, |
- Handle<JSObject> holder, |
- Handle<Name> name, |
- Handle<ExecutableAccessorInfo> callback); |
- |
- Handle<Code> CompileStoreCallback(Handle<JSObject> object, |
- Handle<JSObject> holder, |
- Handle<Name> name, |
- const CallOptimization& call_optimization); |
- |
- static void GenerateStoreViaSetter(MacroAssembler* masm, |
- Handle<JSFunction> setter); |
- |
- Handle<Code> CompileStoreViaSetter(Handle<JSObject> object, |
- Handle<JSObject> holder, |
- Handle<Name> name, |
- Handle<JSFunction> setter); |
- |
- Handle<Code> CompileStoreInterceptor(Handle<JSObject> object, |
- Handle<Name> name); |
+ protected: |
+ static Register* registers(); |
private: |
- static Register* registers(); |
- virtual Code::Kind kind() { return Code::STORE_IC; } |
- virtual Logger::LogEventsAndTags log_kind(Handle<Code> code) { |
- if (!code->is_inline_cache_stub()) return Logger::STUB_TAG; |
- return code->ic_state() == MONOMORPHIC |
- ? Logger::STORE_IC_TAG : Logger::STORE_POLYMORPHIC_IC_TAG; |
- } |
- virtual void JitEvent(Handle<Name> name, Handle<Code> code); |
+ StrictModeFlag strict_mode_; |
+ friend class BaseLoadStoreStubCompiler; |
}; |
-class KeyedStoreStubCompiler: public BaseStoreStubCompiler { |
+class KeyedStoreStubCompiler: public StoreStubCompiler { |
public: |
KeyedStoreStubCompiler(Isolate* isolate, |
StrictModeFlag strict_mode, |
KeyedAccessStoreMode store_mode) |
- : BaseStoreStubCompiler(isolate, strict_mode, registers()), |
+ : StoreStubCompiler(isolate, strict_mode, Code::KEYED_STORE_IC), |
store_mode_(store_mode) { } |
Handle<Code> CompileStoreElement(Handle<Map> receiver_map); |
@@ -994,24 +889,18 @@ class KeyedStoreStubCompiler: public BaseStoreStubCompiler { |
virtual Code::ExtraICState extra_state() { |
return Code::ComputeExtraICState(store_mode_, strict_mode()); |
} |
+ static Register* registers(); |
private: |
Register transition_map() { |
return registers()[3]; |
} |
- static Register* registers(); |
- virtual Code::Kind kind() { return Code::KEYED_STORE_IC; } |
- virtual Logger::LogEventsAndTags log_kind(Handle<Code> code) { |
- if (!code->is_inline_cache_stub()) return Logger::STUB_TAG; |
- return code->ic_state() == MONOMORPHIC |
- ? Logger::KEYED_STORE_IC_TAG : Logger::KEYED_STORE_POLYMORPHIC_IC_TAG; |
- } |
- virtual void JitEvent(Handle<Name> name, Handle<Code> code); |
virtual void GenerateNameCheck(Handle<Name> name, |
Register name_reg, |
Label* miss); |
KeyedAccessStoreMode store_mode_; |
+ friend class BaseLoadStoreStubCompiler; |
}; |