Index: src/ic.cc |
diff --git a/src/ic.cc b/src/ic.cc |
index 7f27d3f9bb777617ba0da92a29c78b8715e1e614..56224cc21f380450f15d718eac957bdbba7a2b39 100644 |
--- a/src/ic.cc |
+++ b/src/ic.cc |
@@ -1709,15 +1709,21 @@ MaybeObject* StoreIC::Store(State state, |
} |
LookupResult lookup(isolate()); |
- if (LookupForWrite(receiver, name, value, &lookup, &state)) { |
- if (FLAG_use_ic) { |
- UpdateCaches(&lookup, state, strict_mode, receiver, name, value); |
- } |
- } else if (strict_mode == kStrictMode && |
- !(lookup.IsProperty() && lookup.IsReadOnly()) && |
- IsUndeclaredGlobal(object)) { |
+ bool can_store = LookupForWrite(receiver, name, value, &lookup, &state); |
+ if (!can_store && |
Jakob Kummerow
2013/09/03 09:58:59
nit: I'm finding this heterogeneous if/else cascad
|
+ strict_mode == kStrictMode && |
+ !(lookup.IsProperty() && lookup.IsReadOnly()) && |
+ IsUndeclaredGlobal(object)) { |
// Strict mode doesn't allow setting non-existent global property. |
return ReferenceError("not_defined", name); |
+ } else if (FLAG_use_ic && state == UNINITIALIZED) { |
+ Handle<Code> stub = (strict_mode == kStrictMode) |
+ ? pre_monomorphic_stub_strict() |
+ : pre_monomorphic_stub(); |
+ set_target(*stub); |
+ TRACE_IC("StoreIC", name, state, *stub); |
+ } else if (FLAG_use_ic && can_store) { |
+ UpdateCaches(&lookup, state, strict_mode, receiver, name, value); |
} else if (FLAG_use_ic && |
(!name->IsCacheable(isolate()) || |
lookup.IsNormal() || |