Index: src/ic.cc |
diff --git a/src/ic.cc b/src/ic.cc |
index 463429e41787c803b0b2cebbd48010641ef0a715..28bbd94e82837600a808d4a56e58514fd26db918 100644 |
--- a/src/ic.cc |
+++ b/src/ic.cc |
@@ -501,14 +501,7 @@ void CallIC::Clear(Isolate* isolate, |
Code* target, |
ConstantPoolArray* constant_pool) { |
// Currently, CallIC doesn't have state changes. |
- if (target->ic_state() != v8::internal::MONOMORPHIC) return; |
- CallIC::State existing_state(target->extra_ic_state()); |
- |
- // Monomorphic array stubs don't need to be cleared because |
- // 1) the stub doesn't store information that should be cleared, and |
- // 2) the AllocationSite stored in the type feedback vector is immune |
- // from gc type feedback clearing. |
- ASSERT(existing_state.stub_type() == MONOMORPHIC_ARRAY); |
+ ASSERT(target->ic_state() == v8::internal::GENERIC); |
} |
@@ -1825,49 +1818,18 @@ MaybeHandle<Object> KeyedStoreIC::Store(Handle<Object> object, |
CallIC::State::State(ExtraICState extra_ic_state) |
: argc_(ArgcBits::decode(extra_ic_state)), |
- call_type_(CallTypeBits::decode(extra_ic_state)), |
- stub_type_(StubTypeBits::decode(extra_ic_state)) { |
+ call_type_(CallTypeBits::decode(extra_ic_state)) { |
} |
ExtraICState CallIC::State::GetExtraICState() const { |
ExtraICState extra_ic_state = |
ArgcBits::encode(argc_) | |
- CallTypeBits::encode(call_type_) | |
- StubTypeBits::encode(stub_type_); |
+ CallTypeBits::encode(call_type_); |
return extra_ic_state; |
} |
-bool CallIC::DoCustomHandler(Handle<Object> receiver, |
- Handle<Object> function, |
- Handle<FixedArray> vector, |
- Handle<Smi> slot, |
- const State& state) { |
- ASSERT(function->IsJSFunction()); |
- // Are we the array function? |
- Handle<JSFunction> array_function = Handle<JSFunction>( |
- isolate()->context()->native_context()->array_function(), isolate()); |
- if (array_function.is_identical_to(Handle<JSFunction>::cast(function))) { |
- // Alter the slot. |
- Handle<AllocationSite> new_site = isolate()->factory()->NewAllocationSite(); |
- vector->set(slot->value(), *new_site); |
- State new_state = state.ToMonomorphicArrayCallState(); |
- CallICStub stub(isolate(), new_state); |
- set_target(*stub.GetCode()); |
- Handle<String> name; |
- if (array_function->shared()->name()->IsString()) { |
- name = Handle<String>(String::cast(array_function->shared()->name()), |
- isolate()); |
- } |
- |
- TRACE_IC("CallIC (Array call)", name); |
- return true; |
- } |
- return false; |
-} |
- |
- |
void CallIC::HandleMiss(Handle<Object> receiver, |
Handle<Object> function, |
Handle<FixedArray> vector, |
@@ -1875,33 +1837,18 @@ void CallIC::HandleMiss(Handle<Object> receiver, |
State state(target()->extra_ic_state()); |
Object* feedback = vector->get(slot->value()); |
- if (feedback->IsJSFunction() || !function->IsJSFunction() || |
- state.stub_type() != DEFAULT) { |
+ if (feedback->IsJSFunction() || !function->IsJSFunction()) { |
// We are going generic. |
+ ASSERT(!function->IsJSFunction() || *function != feedback); |
+ |
vector->set(slot->value(), |
*TypeFeedbackInfo::MegamorphicSentinel(isolate()), |
SKIP_WRITE_BARRIER); |
- |
- State new_state = state.ToGenericState(); |
- if (new_state != state) { |
- // Only happens when the array ic goes generic. |
- ASSERT(state.stub_type() == MONOMORPHIC_ARRAY); |
- CallICStub stub(isolate(), new_state); |
- Handle<Code> code = stub.GetCode(); |
- set_target(*code); |
- } |
- |
TRACE_GENERIC_IC(isolate(), "CallIC", "megamorphic"); |
} else { |
// If we came here feedback must be the uninitialized sentinel, |
// and we are going monomorphic. |
ASSERT(feedback == *TypeFeedbackInfo::UninitializedSentinel(isolate())); |
- |
- // Do we want to install a custom handler? |
- if (DoCustomHandler(receiver, function, vector, slot, state)) { |
- return; |
- } |
- |
Handle<JSFunction> js_function = Handle<JSFunction>::cast(function); |
Handle<Object> name(js_function->shared()->name(), isolate()); |
TRACE_IC("CallIC", name); |