| Index: src/ic.cc
|
| diff --git a/src/ic.cc b/src/ic.cc
|
| index d66e64b3644dfffe184a1ed659b07a763b4d7e9a..3830b916ad1b1f27797443e75748053433318f15 100644
|
| --- a/src/ic.cc
|
| +++ b/src/ic.cc
|
| @@ -1837,8 +1837,13 @@ bool CallIC::DoCustomHandler(Handle<Object> receiver,
|
| isolate()->native_context()->array_function());
|
| 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);
|
| + Object* feedback = vector->get(slot->value());
|
| + if (!feedback->IsAllocationSite()) {
|
| + Handle<AllocationSite> new_site =
|
| + isolate()->factory()->NewAllocationSite();
|
| + vector->set(slot->value(), *new_site);
|
| + }
|
| +
|
| CallIC_ArrayStub stub(isolate(), state);
|
| set_target(*stub.GetCode());
|
| Handle<String> name;
|
| @@ -1878,6 +1883,9 @@ void CallIC::HandleMiss(Handle<Object> receiver,
|
| State state(target()->extra_ic_state());
|
| Object* feedback = vector->get(slot->value());
|
|
|
| + // Hand-coded MISS handling is easier if CallIC slots don't contain smis.
|
| + ASSERT(!feedback->IsSmi());
|
| +
|
| if (feedback->IsJSFunction() || !function->IsJSFunction()) {
|
| // We are going generic.
|
| vector->set(slot->value(),
|
| @@ -1886,9 +1894,14 @@ void CallIC::HandleMiss(Handle<Object> receiver,
|
|
|
| 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()));
|
| + // The feedback is either uninitialized or an allocation site.
|
| + // It might be an allocation site because if we re-compile the full code
|
| + // to add deoptimization support, we call with the default call-ic, and
|
| + // merely need to patch the target to match the feedback.
|
| + // TODO(mvstanton): the better approach is to dispense with patching
|
| + // altogether, which is in progress.
|
| + ASSERT(feedback == *TypeFeedbackInfo::UninitializedSentinel(isolate()) ||
|
| + feedback->IsAllocationSite());
|
|
|
| // Do we want to install a custom handler?
|
| if (FLAG_use_ic &&
|
|
|