| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index 5665889c17762ad243d845aa7c5f50e0ceba0701..77f00d550136e6b15b52e83d18c9589660fada0d 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -11245,13 +11245,30 @@ void Code::ClearInlineCaches(Code::Kind* kind) {
|
| void SharedFunctionInfo::ClearTypeFeedbackInfo() {
|
| FixedArray* vector = feedback_vector();
|
| Heap* heap = GetHeap();
|
| - for (int i = 0; i < vector->length(); i++) {
|
| + Context* context = GetIsolate()->context();
|
| + JSFunction* array_function = context != NULL
|
| + ? context->native_context()->array_function()
|
| + : NULL;
|
| + int length = vector->length();
|
| +
|
| + for (int i = 0; i < length; i++) {
|
| Object* obj = vector->get(i);
|
| - if (!obj->IsAllocationSite()) {
|
| - vector->set(
|
| - i,
|
| - TypeFeedbackInfo::RawUninitializedSentinel(heap),
|
| - SKIP_WRITE_BARRIER);
|
| + if (obj->IsHeapObject()) {
|
| + InstanceType instance_type =
|
| + HeapObject::cast(obj)->map()->instance_type();
|
| + switch (instance_type) {
|
| + case ALLOCATION_SITE_TYPE:
|
| + // AllocationSites are not cleared because they do not store
|
| + // information that leaks.
|
| + break;
|
| + case JS_FUNCTION_TYPE:
|
| + // No need to clear the native context array function.
|
| + if (obj == array_function) break;
|
| + // Fall through...
|
| + default:
|
| + vector->set(i, TypeFeedbackInfo::RawUninitializedSentinel(heap),
|
| + SKIP_WRITE_BARRIER);
|
| + }
|
| }
|
| }
|
| }
|
|
|