Index: src/stub-cache.h |
diff --git a/src/stub-cache.h b/src/stub-cache.h |
index 451af319dfc9af8c1db2b0614ffe422b3e08ae8c..3a98f544c755bed4441e3049768cfec3fb026b34 100644 |
--- a/src/stub-cache.h |
+++ b/src/stub-cache.h |
@@ -78,36 +78,36 @@ class StubCache { |
// Computes the right stub matching. Inserts the result in the |
// cache before returning. This might compile a stub if needed. |
Handle<Code> ComputeLoadNonexistent(Handle<String> name, |
- Handle<JSObject> receiver); |
+ Handle<JSObject> object); |
Handle<Code> ComputeLoadField(Handle<String> name, |
- Handle<JSObject> receiver, |
+ Handle<JSObject> object, |
Handle<JSObject> holder, |
PropertyIndex field_index); |
Handle<Code> ComputeLoadCallback(Handle<String> name, |
- Handle<JSObject> receiver, |
+ Handle<JSObject> object, |
Handle<JSObject> holder, |
Handle<AccessorInfo> callback); |
Handle<Code> ComputeLoadViaGetter(Handle<String> name, |
- Handle<JSObject> receiver, |
+ Handle<JSObject> object, |
Handle<JSObject> holder, |
Handle<JSFunction> getter); |
Handle<Code> ComputeLoadConstant(Handle<String> name, |
- Handle<JSObject> receiver, |
+ Handle<JSObject> object, |
Handle<JSObject> holder, |
Handle<JSFunction> value); |
Handle<Code> ComputeLoadInterceptor(Handle<String> name, |
- Handle<JSObject> receiver, |
+ Handle<JSObject> object, |
Handle<JSObject> holder); |
Handle<Code> ComputeLoadNormal(); |
Handle<Code> ComputeLoadGlobal(Handle<String> name, |
- Handle<JSObject> receiver, |
+ Handle<JSObject> object, |
Handle<GlobalObject> holder, |
Handle<JSGlobalPropertyCell> cell, |
bool is_dont_delete); |
@@ -115,28 +115,28 @@ class StubCache { |
// --- |
Handle<Code> ComputeKeyedLoadField(Handle<String> name, |
- Handle<JSObject> receiver, |
+ Handle<JSObject> object, |
Handle<JSObject> holder, |
PropertyIndex field_index); |
Handle<Code> ComputeKeyedLoadCallback(Handle<String> name, |
- Handle<JSObject> receiver, |
+ Handle<JSObject> object, |
Handle<JSObject> holder, |
Handle<AccessorInfo> callback); |
Handle<Code> ComputeKeyedLoadConstant(Handle<String> name, |
- Handle<JSObject> receiver, |
+ Handle<JSObject> object, |
Handle<JSObject> holder, |
Handle<JSFunction> value); |
Handle<Code> ComputeKeyedLoadInterceptor(Handle<String> name, |
- Handle<JSObject> receiver, |
+ Handle<JSObject> object, |
Handle<JSObject> holder); |
// --- |
Handle<Code> ComputeStoreField(Handle<String> name, |
- Handle<JSObject> receiver, |
+ Handle<JSObject> object, |
int field_index, |
Handle<Map> transition, |
StrictModeFlag strict_mode); |
@@ -144,30 +144,30 @@ class StubCache { |
Handle<Code> ComputeStoreNormal(StrictModeFlag strict_mode); |
Handle<Code> ComputeStoreGlobal(Handle<String> name, |
- Handle<GlobalObject> receiver, |
+ Handle<GlobalObject> object, |
Handle<JSGlobalPropertyCell> cell, |
StrictModeFlag strict_mode); |
Handle<Code> ComputeStoreCallback(Handle<String> name, |
- Handle<JSObject> receiver, |
+ Handle<JSObject> object, |
Handle<JSObject> holder, |
Handle<AccessorInfo> callback, |
StrictModeFlag strict_mode); |
Handle<Code> ComputeStoreViaSetter(Handle<String> name, |
- Handle<JSObject> receiver, |
+ Handle<JSObject> object, |
Handle<JSObject> holder, |
Handle<JSFunction> setter, |
StrictModeFlag strict_mode); |
Handle<Code> ComputeStoreInterceptor(Handle<String> name, |
- Handle<JSObject> receiver, |
+ Handle<JSObject> object, |
StrictModeFlag strict_mode); |
// --- |
Handle<Code> ComputeKeyedStoreField(Handle<String> name, |
- Handle<JSObject> receiver, |
+ Handle<JSObject> object, |
int field_index, |
Handle<Map> transition, |
StrictModeFlag strict_mode); |
@@ -208,7 +208,7 @@ class StubCache { |
Code::Kind, |
Code::ExtraICState extra_state, |
Handle<String> name, |
- Handle<JSObject> receiver, |
+ Handle<JSObject> object, |
Handle<GlobalObject> holder, |
Handle<JSGlobalPropertyCell> cell, |
Handle<JSFunction> function); |
@@ -602,42 +602,69 @@ class StubCompiler BASE_EMBEDDED { |
}; |
-class LoadStubCompiler: public StubCompiler { |
+class BaseLoadStubCompiler: public StubCompiler { |
public: |
- explicit LoadStubCompiler(Isolate* isolate) : StubCompiler(isolate) { } |
- |
- Handle<Code> CompileLoadNonexistent(Handle<String> name, |
- Handle<JSObject> object, |
- Handle<JSObject> last, |
- Handle<GlobalObject> global); |
+ BaseLoadStubCompiler(Isolate* isolate, Register* registers) |
+ : StubCompiler(isolate), registers_(registers) { } |
+ virtual ~BaseLoadStubCompiler() { } |
Handle<Code> CompileLoadField(Handle<JSObject> object, |
Handle<JSObject> holder, |
- PropertyIndex index, |
- Handle<String> name); |
+ Handle<String> name, |
+ PropertyIndex index); |
- Handle<Code> CompileLoadCallback(Handle<String> name, |
- Handle<JSObject> object, |
+ Handle<Code> CompileLoadCallback(Handle<JSObject> object, |
Handle<JSObject> holder, |
+ Handle<String> name, |
Handle<AccessorInfo> callback); |
- static void GenerateLoadViaGetter(MacroAssembler* masm, |
- Handle<JSFunction> getter); |
- |
- Handle<Code> CompileLoadViaGetter(Handle<String> name, |
- Handle<JSObject> receiver, |
- Handle<JSObject> holder, |
- Handle<JSFunction> getter); |
- |
Handle<Code> CompileLoadConstant(Handle<JSObject> object, |
Handle<JSObject> holder, |
- Handle<JSFunction> value, |
- Handle<String> name); |
+ Handle<String> name, |
+ Handle<JSFunction> value); |
Handle<Code> CompileLoadInterceptor(Handle<JSObject> object, |
Handle<JSObject> holder, |
Handle<String> name); |
+ protected: |
+ Register receiver() { return registers_[0]; } |
+ Register name() { return registers_[1]; } |
+ Register scratch1() { return registers_[2]; } |
+ Register scratch2() { return registers_[3]; } |
+ Register scratch3() { return registers_[4]; } |
+ Register scratch4() { return registers_[5]; } |
+ |
+ private: |
+ virtual Code::Kind kind() = 0; |
+ virtual void GenerateNameCheck(Handle<String> name, |
+ Register name_reg, |
+ Label* miss) { } |
+ virtual Handle<Code> GetCode(Code::StubType type, |
+ Handle<String> name, |
+ InlineCacheState state = MONOMORPHIC) = 0; |
+ Register* registers_; |
+}; |
+ |
+ |
+class LoadStubCompiler: public BaseLoadStubCompiler { |
+ public: |
+ explicit LoadStubCompiler(Isolate* isolate) |
+ : BaseLoadStubCompiler(isolate, registers()) { } |
+ |
+ Handle<Code> CompileLoadNonexistent(Handle<JSObject> object, |
+ Handle<JSObject> last, |
+ Handle<String> name, |
+ Handle<GlobalObject> global); |
+ |
+ static void GenerateLoadViaGetter(MacroAssembler* masm, |
+ Handle<JSFunction> getter); |
+ |
+ Handle<Code> CompileLoadViaGetter(Handle<JSObject> object, |
+ Handle<JSObject> holder, |
+ Handle<String> name, |
+ Handle<JSFunction> getter); |
+ |
Handle<Code> CompileLoadGlobal(Handle<JSObject> object, |
Handle<GlobalObject> holder, |
Handle<JSGlobalPropertyCell> cell, |
@@ -645,32 +672,18 @@ class LoadStubCompiler: public StubCompiler { |
bool is_dont_delete); |
private: |
- Handle<Code> GetCode(Code::StubType type, Handle<String> name); |
+ Register* registers(); |
+ virtual Code::Kind kind() { return Code::LOAD_IC; } |
+ virtual Handle<Code> GetCode(Code::StubType type, |
+ Handle<String> name, |
+ InlineCacheState state = MONOMORPHIC); |
}; |
-class KeyedLoadStubCompiler: public StubCompiler { |
+class KeyedLoadStubCompiler: public BaseLoadStubCompiler { |
public: |
- explicit KeyedLoadStubCompiler(Isolate* isolate) : StubCompiler(isolate) { } |
- |
- Handle<Code> CompileLoadField(Handle<String> name, |
- Handle<JSObject> object, |
- Handle<JSObject> holder, |
- PropertyIndex index); |
- |
- Handle<Code> CompileLoadCallback(Handle<String> name, |
- Handle<JSObject> object, |
- Handle<JSObject> holder, |
- Handle<AccessorInfo> callback); |
- |
- Handle<Code> CompileLoadConstant(Handle<String> name, |
- Handle<JSObject> object, |
- Handle<JSObject> holder, |
- Handle<JSFunction> value); |
- |
- Handle<Code> CompileLoadInterceptor(Handle<JSObject> object, |
- Handle<JSObject> holder, |
- Handle<String> name); |
+ explicit KeyedLoadStubCompiler(Isolate* isolate) |
+ : BaseLoadStubCompiler(isolate, registers()) { } |
Handle<Code> CompileLoadElement(Handle<Map> receiver_map); |
@@ -682,9 +695,14 @@ class KeyedLoadStubCompiler: public StubCompiler { |
static void GenerateLoadDictionaryElement(MacroAssembler* masm); |
private: |
- Handle<Code> GetCode(Code::StubType type, |
- Handle<String> name, |
- InlineCacheState state = MONOMORPHIC); |
+ Register* registers(); |
+ virtual Code::Kind kind() { return Code::KEYED_LOAD_IC; } |
+ virtual Handle<Code> GetCode(Code::StubType type, |
+ Handle<String> name, |
+ InlineCacheState state = MONOMORPHIC); |
+ virtual void GenerateNameCheck(Handle<String> name, |
+ Register name_reg, |
+ Label* miss); |
}; |
@@ -700,7 +718,7 @@ class StoreStubCompiler: public StubCompiler { |
Handle<String> name); |
Handle<Code> CompileStoreCallback(Handle<String> name, |
- Handle<JSObject> receiver, |
+ Handle<JSObject> object, |
Handle<JSObject> holder, |
Handle<AccessorInfo> callback); |
@@ -708,7 +726,7 @@ class StoreStubCompiler: public StubCompiler { |
Handle<JSFunction> setter); |
Handle<Code> CompileStoreViaSetter(Handle<String> name, |
- Handle<JSObject> receiver, |
+ Handle<JSObject> object, |
Handle<JSObject> holder, |
Handle<JSFunction> setter); |