Commit 2987b117 authored by verwaest@chromium.org's avatar verwaest@chromium.org

Install a generic handler whenever we fail to update the IC.

Ignore select cases in StoreIC since we don't have premonomorphic.

R=jkummerow@chromium.org

Review URL: https://chromiumcodereview.appspot.com/17027007

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@15145 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent b0860dd2
...@@ -1581,8 +1581,8 @@ void StoreIC::GenerateNormal(MacroAssembler* masm) { ...@@ -1581,8 +1581,8 @@ void StoreIC::GenerateNormal(MacroAssembler* masm) {
} }
void StoreIC::GenerateGlobalProxy(MacroAssembler* masm, void StoreIC::GenerateRuntimeSetProperty(MacroAssembler* masm,
StrictModeFlag strict_mode) { StrictModeFlag strict_mode) {
// ----------- S t a t e ------------- // ----------- S t a t e -------------
// -- r0 : value // -- r0 : value
// -- r1 : receiver // -- r1 : receiver
......
...@@ -1496,12 +1496,12 @@ static void Generate_StoreIC_Megamorphic_Strict(MacroAssembler* masm) { ...@@ -1496,12 +1496,12 @@ static void Generate_StoreIC_Megamorphic_Strict(MacroAssembler* masm) {
static void Generate_StoreIC_GlobalProxy(MacroAssembler* masm) { static void Generate_StoreIC_GlobalProxy(MacroAssembler* masm) {
StoreIC::GenerateGlobalProxy(masm, kNonStrictMode); StoreIC::GenerateRuntimeSetProperty(masm, kNonStrictMode);
} }
static void Generate_StoreIC_GlobalProxy_Strict(MacroAssembler* masm) { static void Generate_StoreIC_GlobalProxy_Strict(MacroAssembler* masm) {
StoreIC::GenerateGlobalProxy(masm, kStrictMode); StoreIC::GenerateRuntimeSetProperty(masm, kStrictMode);
} }
...@@ -1510,6 +1510,16 @@ static void Generate_StoreIC_Setter_ForDeopt(MacroAssembler* masm) { ...@@ -1510,6 +1510,16 @@ static void Generate_StoreIC_Setter_ForDeopt(MacroAssembler* masm) {
} }
static void Generate_StoreIC_Generic(MacroAssembler* masm) {
StoreIC::GenerateRuntimeSetProperty(masm, kNonStrictMode);
}
static void Generate_StoreIC_Generic_Strict(MacroAssembler* masm) {
StoreIC::GenerateRuntimeSetProperty(masm, kStrictMode);
}
static void Generate_KeyedStoreIC_Generic(MacroAssembler* masm) { static void Generate_KeyedStoreIC_Generic(MacroAssembler* masm) {
KeyedStoreIC::GenerateGeneric(masm, kNonStrictMode); KeyedStoreIC::GenerateGeneric(masm, kNonStrictMode);
} }
......
...@@ -166,6 +166,10 @@ enum BuiltinExtraArguments { ...@@ -166,6 +166,10 @@ enum BuiltinExtraArguments {
Code::kNoExtraICState) \ Code::kNoExtraICState) \
V(StoreIC_Megamorphic, STORE_IC, MEGAMORPHIC, \ V(StoreIC_Megamorphic, STORE_IC, MEGAMORPHIC, \
Code::kNoExtraICState) \ Code::kNoExtraICState) \
V(StoreIC_Generic, STORE_IC, GENERIC, \
Code::kNoExtraICState) \
V(StoreIC_Generic_Strict, STORE_IC, GENERIC, \
kStrictMode) \
V(StoreIC_GlobalProxy, STORE_IC, GENERIC, \ V(StoreIC_GlobalProxy, STORE_IC, GENERIC, \
Code::kNoExtraICState) \ Code::kNoExtraICState) \
V(StoreIC_Initialize_Strict, STORE_IC, UNINITIALIZED, \ V(StoreIC_Initialize_Strict, STORE_IC, UNINITIALIZED, \
......
...@@ -1482,8 +1482,8 @@ void StoreIC::GenerateNormal(MacroAssembler* masm) { ...@@ -1482,8 +1482,8 @@ void StoreIC::GenerateNormal(MacroAssembler* masm) {
} }
void StoreIC::GenerateGlobalProxy(MacroAssembler* masm, void StoreIC::GenerateRuntimeSetProperty(MacroAssembler* masm,
StrictModeFlag strict_mode) { StrictModeFlag strict_mode) {
// ----------- S t a t e ------------- // ----------- S t a t e -------------
// -- eax : value // -- eax : value
// -- ecx : name // -- ecx : name
......
...@@ -936,15 +936,7 @@ MaybeObject* LoadIC::Load(State state, ...@@ -936,15 +936,7 @@ MaybeObject* LoadIC::Load(State state,
} }
// Update inline cache and stub cache. // Update inline cache and stub cache.
if (FLAG_use_ic) { if (FLAG_use_ic) UpdateCaches(&lookup, state, object, name);
if (!object->IsJSObject()) {
// TODO(jkummerow): It would be nice to support non-JSObjects in
// UpdateCaches, then we wouldn't need to go generic here.
set_target(*generic_stub());
} else {
UpdateCaches(&lookup, state, object, name);
}
}
PropertyAttributes attr; PropertyAttributes attr;
if (lookup.IsInterceptor() || lookup.IsHandler()) { if (lookup.IsInterceptor() || lookup.IsHandler()) {
...@@ -1204,11 +1196,17 @@ void LoadIC::UpdateCaches(LookupResult* lookup, ...@@ -1204,11 +1196,17 @@ void LoadIC::UpdateCaches(LookupResult* lookup,
Handle<Object> object, Handle<Object> object,
Handle<String> name) { Handle<String> name) {
// Bail out if the result is not cacheable. // Bail out if the result is not cacheable.
if (!lookup->IsCacheable()) return; if (!lookup->IsCacheable()) {
set_target(*generic_stub());
return;
}
// Loading properties from values is not common, so don't try to // TODO(jkummerow): It would be nice to support non-JSObjects in
// deal with non-JS objects here. // UpdateCaches, then we wouldn't need to go generic here.
if (!object->IsJSObject()) return; if (!object->IsJSObject()) {
set_target(*generic_stub());
return;
}
Handle<JSObject> receiver = Handle<JSObject>::cast(object); Handle<JSObject> receiver = Handle<JSObject>::cast(object);
Handle<Code> code; Handle<Code> code;
...@@ -1219,7 +1217,10 @@ void LoadIC::UpdateCaches(LookupResult* lookup, ...@@ -1219,7 +1217,10 @@ void LoadIC::UpdateCaches(LookupResult* lookup,
code = pre_monomorphic_stub(); code = pre_monomorphic_stub();
} else { } else {
code = ComputeLoadHandler(lookup, receiver, name); code = ComputeLoadHandler(lookup, receiver, name);
if (code.is_null()) return; if (code.is_null()) {
set_target(*generic_stub());
return;
}
} }
PatchCache(state, kNonStrictMode, receiver, name, code); PatchCache(state, kNonStrictMode, receiver, name, code);
...@@ -1640,6 +1641,12 @@ MaybeObject* StoreIC::Store(State state, ...@@ -1640,6 +1641,12 @@ MaybeObject* StoreIC::Store(State state,
IsUndeclaredGlobal(object)) { IsUndeclaredGlobal(object)) {
// Strict mode doesn't allow setting non-existent global property. // Strict mode doesn't allow setting non-existent global property.
return ReferenceError("not_defined", name); return ReferenceError("not_defined", name);
} else if (FLAG_use_ic &&
(lookup.IsNormal() ||
(lookup.IsField() && lookup.CanHoldValue(value)))) {
Handle<Code> stub = strict_mode == kStrictMode
? generic_stub_strict() : generic_stub();
set_target(*stub);
} }
// Set the property. // Set the property.
...@@ -1660,9 +1667,14 @@ void StoreIC::UpdateCaches(LookupResult* lookup, ...@@ -1660,9 +1667,14 @@ void StoreIC::UpdateCaches(LookupResult* lookup,
// These are not cacheable, so we never see such LookupResults here. // These are not cacheable, so we never see such LookupResults here.
ASSERT(!lookup->IsHandler()); ASSERT(!lookup->IsHandler());
Handle<Code> code = Handle<Code> code = ComputeStoreMonomorphic(
ComputeStoreMonomorphic(lookup, strict_mode, receiver, name); lookup, strict_mode, receiver, name);
if (code.is_null()) return; if (code.is_null()) {
Handle<Code> stub = strict_mode == kStrictMode
? generic_stub_strict() : generic_stub();
set_target(*stub);
return;
}
PatchCache(state, strict_mode, receiver, name, code); PatchCache(state, strict_mode, receiver, name, code);
TRACE_IC("StoreIC", name, state, target()); TRACE_IC("StoreIC", name, state, target());
......
...@@ -511,8 +511,8 @@ class StoreIC: public IC { ...@@ -511,8 +511,8 @@ class StoreIC: public IC {
static void GenerateMegamorphic(MacroAssembler* masm, static void GenerateMegamorphic(MacroAssembler* masm,
StrictModeFlag strict_mode); StrictModeFlag strict_mode);
static void GenerateNormal(MacroAssembler* masm); static void GenerateNormal(MacroAssembler* masm);
static void GenerateGlobalProxy(MacroAssembler* masm, static void GenerateRuntimeSetProperty(MacroAssembler* masm,
StrictModeFlag strict_mode); StrictModeFlag strict_mode);
MUST_USE_RESULT MaybeObject* Store( MUST_USE_RESULT MaybeObject* Store(
State state, State state,
...@@ -532,6 +532,12 @@ class StoreIC: public IC { ...@@ -532,6 +532,12 @@ class StoreIC: public IC {
virtual Handle<Code> megamorphic_stub_strict() { virtual Handle<Code> megamorphic_stub_strict() {
return isolate()->builtins()->StoreIC_Megamorphic_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();
}
virtual Handle<Code> global_proxy_stub() { virtual Handle<Code> global_proxy_stub() {
return isolate()->builtins()->StoreIC_GlobalProxy(); return isolate()->builtins()->StoreIC_GlobalProxy();
} }
......
...@@ -1502,8 +1502,8 @@ void StoreIC::GenerateNormal(MacroAssembler* masm) { ...@@ -1502,8 +1502,8 @@ void StoreIC::GenerateNormal(MacroAssembler* masm) {
} }
void StoreIC::GenerateGlobalProxy(MacroAssembler* masm, void StoreIC::GenerateRuntimeSetProperty(MacroAssembler* masm,
StrictModeFlag strict_mode) { StrictModeFlag strict_mode) {
// ----------- S t a t e ------------- // ----------- S t a t e -------------
// -- rax : value // -- rax : value
// -- rcx : name // -- rcx : name
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment