Chromium Code Reviews| Index: src/ic.cc |
| diff --git a/src/ic.cc b/src/ic.cc |
| index 08df2261fded944933ef595d3b325924cc1300ab..c0259d4af3eb0a293051d0d98fda8fc2d2f88089 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? |
|
Toon Verwaest
2013/12/04 18:10:52
That comment is a bit superfluous.
mvstanton
2013/12/04 22:08:10
Done.
|
| + ContextualMode mode = IC::GetContextualMode(target->extra_ic_state()); |
| Code* code = |
| target->GetIsolate()->stub_cache()->FindCallInitialize( |
| target->arguments_count(), |
|
Toon Verwaest
2013/12/04 18:10:52
nit: I think you can join these 3 lines on 1 line.
mvstanton
2013/12/04 22:08:10
Done.
|
| - contextual ? RelocInfo::CODE_TARGET_CONTEXT : RelocInfo::CODE_TARGET, |
| + mode, |
| target->kind()); |
| SetTargetAtAddress(address, code); |
| } |
| @@ -525,15 +515,19 @@ 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)); |
| + Code* code = target->GetIsolate()->stub_cache()->FindPreMonomorphicIC( |
|
Toon Verwaest
2013/12/04 18:10:52
LoadIC::pre_monomorphic_stub(target->GetIsolate(),
mvstanton
2013/12/04 22:08:10
I can't quite do that here, because I can't create
|
| + Code::LOAD_IC, |
|
Toon Verwaest
2013/12/04 18:10:52
Join lines.
mvstanton
2013/12/04 22:08:10
Done.
|
| + target->extra_ic_state()); |
| + SetTargetAtAddress(address, code); |
| } |
| 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()))); |
| + Code* code = target->GetIsolate()->stub_cache()->FindPreMonomorphicIC( |
| + Code::STORE_IC, |
|
Toon Verwaest
2013/12/04 18:10:52
Join lines.
mvstanton
2013/12/04 22:08:10
Done.
|
| + target->extra_ic_state()); |
| + SetTargetAtAddress(address, code); |
| } |
| @@ -1117,6 +1111,26 @@ void IC::PatchCache(Handle<Type> type, |
| } |
| +Handle<Code> LoadIC::initialize_stub(Isolate* isolate, ContextualMode mode) { |
| + Handle<Code> ic = isolate->stub_cache()->ComputeLoad(UNINITIALIZED, |
|
Toon Verwaest
2013/12/04 18:10:52
UNINITIALIZED on the next line, join with the mode
mvstanton
2013/12/04 22:08:10
Done, and in the two functions below too.
|
| + IC::ComputeExtraICState(mode)); |
| + return ic; |
| +} |
| + |
| + |
| +Handle<Code> LoadIC::pre_monomorphic_stub(Isolate* isolate, |
| + ContextualMode mode) { |
| + return isolate->stub_cache()->ComputeLoad(PREMONOMORPHIC, |
| + IC::ComputeExtraICState(mode)); |
| +} |
| + |
| + |
| +Handle<Code> LoadIC::megamorphic_stub() { |
| + return isolate()->stub_cache()->ComputeLoad(MEGAMORPHIC, |
| + extra_ic_state()); |
| +} |
| + |
| + |
| Handle<Code> LoadIC::SimpleFieldLoad(int offset, |
| bool inobject, |
| Representation representation) { |
| @@ -1594,6 +1608,35 @@ MaybeObject* StoreIC::Store(Handle<Object> object, |
| } |
| +Handle<Code> StoreIC::initialize_stub(Isolate* isolate, |
| + StrictModeFlag strict_mode, |
| + ContextualMode mode) { |
| + ExtraICState extra_state = ComputeExtraICState(strict_mode, mode); |
| + Handle<Code> ic = isolate->stub_cache()->ComputeStore(UNINITIALIZED, |
| + extra_state); |
| + return ic; |
| +} |
| + |
| + |
| +Handle<Code> StoreIC::megamorphic_stub() { |
| + return isolate()->stub_cache()->ComputeStore(MEGAMORPHIC, extra_ic_state()); |
| +} |
| + |
| + |
| +Handle<Code> StoreIC::generic_stub() const { |
| + return isolate()->stub_cache()->ComputeStore(GENERIC, extra_ic_state()); |
| +} |
| + |
| + |
| +Handle<Code> StoreIC::pre_monomorphic_stub(Isolate* isolate, |
| + StrictModeFlag strict_mode, |
| + ContextualMode contextual_mode) { |
| + ExtraICState state = StoreIC::ComputeExtraICState(strict_mode, |
| + contextual_mode); |
| + return isolate->stub_cache()->ComputeStore(PREMONOMORPHIC, state); |
| +} |
| + |
| + |
| void StoreIC::UpdateCaches(LookupResult* lookup, |
| Handle<JSObject> receiver, |
| Handle<String> name, |