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, |