Add a slow stub for store ICs.
BUG= R=ulan@chromium.org Review URL: https://chromiumcodereview.appspot.com/26807003 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@17158 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
faa0741bd6
commit
83a113482e
@ -1378,6 +1378,11 @@ static void Generate_StoreIC_Slow(MacroAssembler* masm) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void Generate_StoreIC_Slow_Strict(MacroAssembler* masm) {
|
||||||
|
StoreIC::GenerateSlow(masm);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void Generate_StoreIC_Initialize(MacroAssembler* masm) {
|
static void Generate_StoreIC_Initialize(MacroAssembler* masm) {
|
||||||
StoreIC::GenerateInitialize(masm);
|
StoreIC::GenerateInitialize(masm);
|
||||||
}
|
}
|
||||||
@ -1473,6 +1478,11 @@ static void Generate_KeyedStoreIC_Slow(MacroAssembler* masm) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void Generate_KeyedStoreIC_Slow_Strict(MacroAssembler* masm) {
|
||||||
|
KeyedStoreIC::GenerateSlow(masm);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void Generate_KeyedStoreIC_Initialize(MacroAssembler* masm) {
|
static void Generate_KeyedStoreIC_Initialize(MacroAssembler* masm) {
|
||||||
KeyedStoreIC::GenerateInitialize(masm);
|
KeyedStoreIC::GenerateInitialize(masm);
|
||||||
}
|
}
|
||||||
|
@ -117,14 +117,10 @@ enum BuiltinExtraArguments {
|
|||||||
Code::kNoExtraICState) \
|
Code::kNoExtraICState) \
|
||||||
V(StoreIC_Miss, BUILTIN, UNINITIALIZED, \
|
V(StoreIC_Miss, BUILTIN, UNINITIALIZED, \
|
||||||
Code::kNoExtraICState) \
|
Code::kNoExtraICState) \
|
||||||
V(StoreIC_Slow, BUILTIN, UNINITIALIZED, \
|
|
||||||
Code::kNoExtraICState) \
|
|
||||||
V(KeyedStoreIC_Miss, BUILTIN, UNINITIALIZED, \
|
V(KeyedStoreIC_Miss, BUILTIN, UNINITIALIZED, \
|
||||||
Code::kNoExtraICState) \
|
Code::kNoExtraICState) \
|
||||||
V(KeyedStoreIC_MissForceGeneric, BUILTIN, UNINITIALIZED, \
|
V(KeyedStoreIC_MissForceGeneric, BUILTIN, UNINITIALIZED, \
|
||||||
Code::kNoExtraICState) \
|
Code::kNoExtraICState) \
|
||||||
V(KeyedStoreIC_Slow, BUILTIN, UNINITIALIZED, \
|
|
||||||
Code::kNoExtraICState) \
|
|
||||||
V(LoadIC_Initialize, LOAD_IC, UNINITIALIZED, \
|
V(LoadIC_Initialize, LOAD_IC, UNINITIALIZED, \
|
||||||
Code::kNoExtraICState) \
|
Code::kNoExtraICState) \
|
||||||
V(LoadIC_PreMonomorphic, LOAD_IC, PREMONOMORPHIC, \
|
V(LoadIC_PreMonomorphic, LOAD_IC, PREMONOMORPHIC, \
|
||||||
@ -214,6 +210,10 @@ enum BuiltinExtraArguments {
|
|||||||
#define BUILTIN_LIST_H(V) \
|
#define BUILTIN_LIST_H(V) \
|
||||||
V(LoadIC_Slow, LOAD_IC, Code::kNoExtraICState) \
|
V(LoadIC_Slow, LOAD_IC, Code::kNoExtraICState) \
|
||||||
V(KeyedLoadIC_Slow, KEYED_LOAD_IC, Code::kNoExtraICState) \
|
V(KeyedLoadIC_Slow, KEYED_LOAD_IC, Code::kNoExtraICState) \
|
||||||
|
V(StoreIC_Slow, STORE_IC, Code::kNoExtraICState) \
|
||||||
|
V(StoreIC_Slow_Strict, STORE_IC, kStrictMode) \
|
||||||
|
V(KeyedStoreIC_Slow, KEYED_STORE_IC, Code::kNoExtraICState)\
|
||||||
|
V(KeyedStoreIC_Slow_Strict, KEYED_STORE_IC, kStrictMode) \
|
||||||
V(LoadIC_Normal, LOAD_IC, Code::kNoExtraICState) \
|
V(LoadIC_Normal, LOAD_IC, Code::kNoExtraICState) \
|
||||||
V(StoreIC_Normal, STORE_IC, Code::kNoExtraICState) \
|
V(StoreIC_Normal, STORE_IC, Code::kNoExtraICState) \
|
||||||
V(StoreIC_Normal_Strict, STORE_IC, kStrictMode)
|
V(StoreIC_Normal_Strict, STORE_IC, kStrictMode)
|
||||||
|
@ -1603,10 +1603,7 @@ void StoreIC::UpdateCaches(LookupResult* lookup,
|
|||||||
ASSERT(!lookup->IsHandler());
|
ASSERT(!lookup->IsHandler());
|
||||||
|
|
||||||
Handle<Code> code = ComputeStoreHandler(lookup, receiver, name, value);
|
Handle<Code> code = ComputeStoreHandler(lookup, receiver, name, value);
|
||||||
if (code.is_null()) {
|
if (code.is_null()) code = slow_stub();
|
||||||
set_target(*generic_stub());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
PatchCache(receiver, name, code);
|
PatchCache(receiver, name, code);
|
||||||
TRACE_IC("StoreIC", name);
|
TRACE_IC("StoreIC", name);
|
||||||
|
15
src/ic.h
15
src/ic.h
@ -552,6 +552,14 @@ class StoreIC: public IC {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual Handle<Code> slow_stub() const {
|
||||||
|
if (strict_mode() == kStrictMode) {
|
||||||
|
return isolate()->builtins()->StoreIC_Slow_Strict();
|
||||||
|
} else {
|
||||||
|
return isolate()->builtins()->StoreIC_Slow();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
virtual Handle<Code> pre_monomorphic_stub() {
|
virtual Handle<Code> pre_monomorphic_stub() {
|
||||||
return pre_monomorphic_stub(isolate(), strict_mode());
|
return pre_monomorphic_stub(isolate(), strict_mode());
|
||||||
}
|
}
|
||||||
@ -670,6 +678,13 @@ class KeyedStoreIC: public StoreIC {
|
|||||||
return isolate->builtins()->KeyedStoreIC_PreMonomorphic();
|
return isolate->builtins()->KeyedStoreIC_PreMonomorphic();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
virtual Handle<Code> slow_stub() const {
|
||||||
|
if (strict_mode() == kStrictMode) {
|
||||||
|
return isolate()->builtins()->KeyedStoreIC_Slow_Strict();
|
||||||
|
} else {
|
||||||
|
return isolate()->builtins()->KeyedStoreIC_Slow();
|
||||||
|
}
|
||||||
|
}
|
||||||
virtual Handle<Code> megamorphic_stub() {
|
virtual Handle<Code> megamorphic_stub() {
|
||||||
if (strict_mode() == kStrictMode) {
|
if (strict_mode() == kStrictMode) {
|
||||||
return isolate()->builtins()->KeyedStoreIC_Generic_Strict();
|
return isolate()->builtins()->KeyedStoreIC_Generic_Strict();
|
||||||
|
Loading…
Reference in New Issue
Block a user