| Index: src/ic.cc
|
| diff --git a/src/ic.cc b/src/ic.cc
|
| index 0f1c3b416e97dd7264c0b24d85b396420086f403..b40885bf17e3d036e9cafb004c1d9c8032e4777d 100644
|
| --- a/src/ic.cc
|
| +++ b/src/ic.cc
|
| @@ -501,14 +501,6 @@ 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);
|
| }
|
|
|
|
|
| @@ -1351,7 +1343,7 @@ void CallIC::State::Print(StringStream* stream) const {
|
| Handle<Code> CallIC::initialize_stub(Isolate* isolate,
|
| int argc,
|
| CallType call_type) {
|
| - CallICStub stub(isolate, State::DefaultCallState(argc, call_type));
|
| + CallICStub stub(isolate, State(argc, call_type));
|
| Handle<Code> code = stub.GetCode();
|
| return code;
|
| }
|
| @@ -1825,16 +1817,14 @@ 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;
|
| }
|
|
|
| @@ -1853,8 +1843,7 @@ bool CallIC::DoCustomHandler(Handle<Object> receiver,
|
| // 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);
|
| + CallIC_ArrayStub stub(isolate(), state);
|
| set_target(*stub.GetCode());
|
| Handle<String> name;
|
| if (array_function->shared()->name()->IsString()) {
|
| @@ -1869,6 +1858,23 @@ bool CallIC::DoCustomHandler(Handle<Object> receiver,
|
| }
|
|
|
|
|
| +void CallIC::PatchMegamorphic(Handle<FixedArray> vector,
|
| + Handle<Smi> slot) {
|
| + State state(target()->extra_ic_state());
|
| +
|
| + // We are going generic.
|
| + vector->set(slot->value(),
|
| + *TypeFeedbackInfo::MegamorphicSentinel(isolate()),
|
| + SKIP_WRITE_BARRIER);
|
| +
|
| + CallICStub stub(isolate(), state);
|
| + Handle<Code> code = stub.GetCode();
|
| + set_target(*code);
|
| +
|
| + TRACE_GENERIC_IC(isolate(), "CallIC", "megamorphic");
|
| +}
|
| +
|
| +
|
| void CallIC::HandleMiss(Handle<Object> receiver,
|
| Handle<Object> function,
|
| Handle<FixedArray> vector,
|
| @@ -1876,23 +1882,12 @@ 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.
|
| 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 &&
|
| - FLAG_use_ic);
|
| - 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,
|
| @@ -1934,6 +1929,19 @@ RUNTIME_FUNCTION(CallIC_Miss) {
|
| }
|
|
|
|
|
| +RUNTIME_FUNCTION(CallIC_Customization_Miss) {
|
| + HandleScope scope(isolate);
|
| + ASSERT(args.length() == 4);
|
| + // A miss on a custom call ic always results in going megamorphic.
|
| + CallIC ic(isolate);
|
| + Handle<Object> function = args.at<Object>(1);
|
| + Handle<FixedArray> vector = args.at<FixedArray>(2);
|
| + Handle<Smi> slot = args.at<Smi>(3);
|
| + ic.PatchMegamorphic(vector, slot);
|
| + return *function;
|
| +}
|
| +
|
| +
|
| // Used from ic-<arch>.cc.
|
| RUNTIME_FUNCTION(LoadIC_Miss) {
|
| HandleScope scope(isolate);
|
|
|