Index: src/ic.cc |
diff --git a/src/ic.cc b/src/ic.cc |
index 33ce188c39c770629b12a372e396deaa1753a9f5..d0c560852dbab1e68942fbb31c78b8072a56dc59 100644 |
--- a/src/ic.cc |
+++ b/src/ic.cc |
@@ -147,6 +147,9 @@ IC::IC(FrameDepth depth, Isolate* isolate) |
pc_address_ = StackFrame::ResolveReturnAddressLocation(pc_address); |
target_ = handle(raw_target(), isolate); |
state_ = target_->ic_state(); |
+ extra_ic_state_ = target_->needs_extended_extra_ic_state(target_->kind()) |
+ ? target_->extended_extra_ic_state() |
+ : target_->extra_ic_state(); |
} |
@@ -254,9 +257,8 @@ bool CallIC::TryUpdateExtraICState(LookupResult* lookup, |
argc >= 1 && args[1]->IsNumber()) { |
double index = DoubleToInteger(args.number_at(1)); |
if (index < 0 || index >= string->length()) { |
- extra_ic_state_ = |
- StringStubState::update(extra_ic_state(), |
- STRING_INDEX_OUT_OF_BOUNDS); |
+ set_extra_ic_state(StringStubState::update(extra_ic_state(), |
+ STRING_INDEX_OUT_OF_BOUNDS)); |
return true; |
} |
} |
@@ -397,19 +399,6 @@ void IC::UpdateState(Handle<Object> receiver, Handle<Object> name) { |
} |
-RelocInfo::Mode IC::ComputeMode() { |
- Address addr = address(); |
- Code* code = Code::cast(isolate()->FindCodeObject(addr)); |
- for (RelocIterator it(code, RelocInfo::kCodeTargetMask); |
- !it.done(); it.next()) { |
- RelocInfo* info = it.rinfo(); |
- if (info->pc() == addr) return info->rmode(); |
- } |
- UNREACHABLE(); |
- return RelocInfo::NONE32; |
-} |
- |
- |
Failure* IC::TypeError(const char* type, |
Handle<Object> object, |
Handle<Object> key) { |
@@ -504,11 +493,12 @@ void IC::Clear(Isolate* isolate, Address address) { |
void CallICBase::Clear(Address address, Code* target) { |
if (IsCleared(target)) return; |
- bool contextual = CallICBase::Contextual::decode(target->extra_ic_state()); |
+ // Is the site contextual or not? |
+ ContextualMode mode = IC::GetContextualMode(target->extra_ic_state()); |
Code* code = |
target->GetIsolate()->stub_cache()->FindCallInitialize( |
target->arguments_count(), |
- contextual ? RelocInfo::CODE_TARGET_CONTEXT : RelocInfo::CODE_TARGET, |
+ mode, |
target->kind()); |
SetTargetAtAddress(address, code); |
} |
@@ -525,7 +515,8 @@ void KeyedLoadIC::Clear(Isolate* isolate, Address address, Code* target) { |
void LoadIC::Clear(Isolate* isolate, Address address, Code* target) { |
if (IsCleared(target)) return; |
- SetTargetAtAddress(address, *pre_monomorphic_stub(isolate)); |
+ ContextualMode mode = IC::GetContextualMode(target->extra_ic_state()); |
+ SetTargetAtAddress(address, *pre_monomorphic_stub(isolate, mode)); |
} |
@@ -533,7 +524,8 @@ void StoreIC::Clear(Isolate* isolate, Address address, Code* target) { |
if (IsCleared(target)) return; |
SetTargetAtAddress(address, |
*pre_monomorphic_stub( |
- isolate, StoreIC::GetStrictMode(target->extra_ic_state()))); |
+ isolate, StoreIC::GetStrictMode(target->extra_ic_state()), |
+ IC::GetContextualMode(target->extra_ic_state()))); |
} |