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