| 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())));
|
| }
|
|
|
|
|
|
|