Index: src/stub-cache.h |
diff --git a/src/stub-cache.h b/src/stub-cache.h |
index 56e3d4ff743de3d6ef8cc165daed661fbce1c73f..f4d8a149b7af9b14b53d0b69e690fdc6c1b0b555 100644 |
--- a/src/stub-cache.h |
+++ b/src/stub-cache.h |
@@ -80,12 +80,15 @@ class StubCache { |
Handle<Code> FindIC(Handle<Name> name, |
Handle<JSObject> stub_holder, |
Code::Kind kind, |
- Code::StubType type); |
+ Code::StubType type, |
+ Code::ExtraICState extra_state = Code::kNoExtraICState); |
- Handle<Code> FindStub(Handle<Name> name, |
- Handle<JSObject> stub_holder, |
- Code::Kind kind, |
- Code::StubType type); |
+ Handle<Code> FindHandler( |
+ Handle<Name> name, |
+ Handle<JSObject> stub_holder, |
+ Code::Kind kind, |
+ Code::StubType type, |
+ Code::ExtraICState extra_state = Code::kNoExtraICState); |
Handle<Code> ComputeMonomorphicIC(Handle<JSObject> receiver, |
Handle<Code> handler, |
@@ -513,14 +516,23 @@ class StubCompiler BASE_EMBEDDED { |
Handle<Name> name, |
Register receiver_reg, |
Register name_reg, |
+ Register value_reg, |
Register scratch1, |
Register scratch2, |
- Label* miss_label); |
- |
- static void GenerateLoadMiss(MacroAssembler* masm, Code::Kind kind); |
- static void GenerateStoreMiss(MacroAssembler* masm, Code::Kind kind); |
- |
- static void GenerateKeyedLoadMissForceGeneric(MacroAssembler* masm); |
+ Label* miss_label, |
+ Label* miss_restore_name); |
+ |
+ 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; |
+ } |
+ static void TailCallBuiltin(MacroAssembler* masm, Builtins::Name name); |
// Generates code that verifies that the property holder has not changed |
// (checking maps of objects in the prototype chain for fast and global |
@@ -577,7 +589,7 @@ class StubCompiler BASE_EMBEDDED { |
Heap* heap() { return isolate()->heap(); } |
Factory* factory() { return isolate()->factory(); } |
- void GenerateTailCall(Handle<Code> code); |
+ static void GenerateTailCall(MacroAssembler* masm, Handle<Code> code); |
private: |
Isolate* isolate_; |
@@ -739,8 +751,6 @@ class KeyedLoadStubCompiler: public BaseLoadStubCompiler { |
void CompileElementHandlers(MapHandleList* receiver_maps, |
CodeHandleList* handlers); |
- Handle<Code> CompileLoadElementPolymorphic(MapHandleList* receiver_maps); |
- |
static void GenerateLoadDictionaryElement(MacroAssembler* masm); |
static Register receiver() { return registers()[0]; } |
@@ -760,17 +770,63 @@ class KeyedLoadStubCompiler: public BaseLoadStubCompiler { |
}; |
-class StoreStubCompiler: public StubCompiler { |
+class BaseStoreStubCompiler: public StubCompiler { |
public: |
- StoreStubCompiler(Isolate* isolate, StrictModeFlag strict_mode) |
- : StubCompiler(isolate), strict_mode_(strict_mode) { } |
+ BaseStoreStubCompiler(Isolate* isolate, |
+ StrictModeFlag strict_mode, |
+ Register* registers) |
+ : StubCompiler(isolate), |
+ strict_mode_(strict_mode), |
+ registers_(registers) { } |
+ virtual ~BaseStoreStubCompiler() { } |
Handle<Code> CompileStoreField(Handle<JSObject> object, |
int index, |
Handle<Map> transition, |
Handle<Name> name); |
+ protected: |
+ Handle<Code> GetICCode(Code::Kind kind, |
+ Code::StubType type, |
+ Handle<Name> name, |
+ InlineCacheState state = MONOMORPHIC); |
+ |
+ Handle<Code> GetCode(Code::Kind kind, |
+ Code::StubType type, |
+ Handle<Name> name); |
+ |
+ void GenerateRestoreName(MacroAssembler* masm, |
+ Label* label, |
+ Handle<Name> name); |
+ |
+ Register receiver() { return registers_[0]; } |
+ Register name() { return registers_[1]; } |
+ Register value() { return registers_[2]; } |
+ Register scratch1() { return registers_[3]; } |
+ Register scratch2() { return registers_[4]; } |
+ Register scratch3() { return registers_[5]; } |
+ StrictModeFlag strict_mode() { return strict_mode_; } |
+ virtual Code::ExtraICState extra_state() { return strict_mode_; } |
+ |
+ private: |
+ virtual Code::Kind kind() = 0; |
+ virtual Logger::LogEventsAndTags log_kind(Handle<Code> code) = 0; |
+ virtual void JitEvent(Handle<Name> name, Handle<Code> code) = 0; |
+ virtual void GenerateNameCheck(Handle<Name> name, |
+ Register name_reg, |
+ Label* miss) { } |
+ StrictModeFlag strict_mode_; |
+ Register* registers_; |
+}; |
+ |
+ |
+class StoreStubCompiler: public BaseStoreStubCompiler { |
+ public: |
+ StoreStubCompiler(Isolate* isolate, StrictModeFlag strict_mode) |
+ : BaseStoreStubCompiler(isolate, strict_mode, registers()) { } |
+ |
+ |
Handle<Code> CompileStoreCallback(Handle<Name> name, |
Handle<JSObject> object, |
Handle<JSObject> holder, |
@@ -792,25 +848,24 @@ class StoreStubCompiler: public StubCompiler { |
Handle<Name> name); |
private: |
- Handle<Code> GetCode(Code::StubType type, Handle<Name> name); |
- |
- StrictModeFlag strict_mode_; |
+ 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); |
}; |
-class KeyedStoreStubCompiler: public StubCompiler { |
+class KeyedStoreStubCompiler: public BaseStoreStubCompiler { |
public: |
KeyedStoreStubCompiler(Isolate* isolate, |
StrictModeFlag strict_mode, |
KeyedAccessStoreMode store_mode) |
- : StubCompiler(isolate), |
- strict_mode_(strict_mode), |
- store_mode_(store_mode) { } |
- |
- Handle<Code> CompileStoreField(Handle<JSObject> object, |
- int index, |
- Handle<Map> transition, |
- Handle<Name> name); |
+ : BaseStoreStubCompiler(isolate, strict_mode, registers()), |
+ store_mode_(store_mode) { } |
Handle<Code> CompileStoreElement(Handle<Map> receiver_map); |
@@ -834,12 +889,23 @@ class KeyedStoreStubCompiler: public StubCompiler { |
static void GenerateStoreDictionaryElement(MacroAssembler* masm); |
- private: |
- Handle<Code> GetCode(Code::StubType type, |
- Handle<Name> name, |
- InlineCacheState state = MONOMORPHIC); |
+ protected: |
+ virtual Code::ExtraICState extra_state() { |
+ return Code::ComputeExtraICState(store_mode_, strict_mode()); |
+ } |
- StrictModeFlag strict_mode_; |
+ private: |
+ 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_; |
}; |