Index: src/mark-compact.cc |
diff --git a/src/mark-compact.cc b/src/mark-compact.cc |
index f04a8bcb9a64105a496b8e4926cc833d06b7bc3a..69021095e30c13903b940e09d3e6fea2ae6b80ce 100644 |
--- a/src/mark-compact.cc |
+++ b/src/mark-compact.cc |
@@ -449,7 +449,7 @@ void MarkCompactCollector::CollectGarbage() { |
#ifdef VERIFY_HEAP |
if (heap()->weak_embedded_objects_verification_enabled()) { |
- VerifyWeakEmbeddedObjectsInOptimizedCode(); |
+ VerifyWeakEmbeddedObjectsInCode(); |
} |
if (FLAG_collect_maps && FLAG_omit_map_checks_for_leaf_maps) { |
VerifyOmittedMapChecks(); |
@@ -510,13 +510,13 @@ void MarkCompactCollector::VerifyMarkbitsAreClean() { |
} |
-void MarkCompactCollector::VerifyWeakEmbeddedObjectsInOptimizedCode() { |
+void MarkCompactCollector::VerifyWeakEmbeddedObjectsInCode() { |
HeapObjectIterator code_iterator(heap()->code_space()); |
for (HeapObject* obj = code_iterator.Next(); |
obj != NULL; |
obj = code_iterator.Next()) { |
Code* code = Code::cast(obj); |
- if (code->kind() != Code::OPTIMIZED_FUNCTION) continue; |
+ if (!code->is_optimized_code() && !code->is_weak_stub()) continue; |
if (WillBeDeoptimized(code)) continue; |
code->VerifyEmbeddedObjectsDependency(); |
} |
@@ -2582,9 +2582,11 @@ void MarkCompactCollector::ClearNonLiveReferences() { |
if (map_mark.Get()) { |
ClearNonLiveDependentCode(map->dependent_code()); |
+ ClearNonLiveDependentIC(map); |
} else { |
ClearAndDeoptimizeDependentCode(map->dependent_code()); |
map->set_dependent_code(DependentCode::cast(heap()->empty_fixed_array())); |
+ ClearAndInvalidateDependentIC(map); |
} |
} |
@@ -2765,6 +2767,32 @@ void MarkCompactCollector::ClearNonLiveDependentCode(DependentCode* entries) { |
} |
+void MarkCompactCollector::ClearAndInvalidateDependentIC(Map* map) { |
+ Object* current = map->dependent_ic(); |
+ Object* undefined = heap()->undefined_value(); |
+ while (current != undefined) { |
+ Code* code = Code::cast(current); |
+ if (IsMarked(code)) { |
+ ASSERT(code->is_weak_stub()); |
+ IC::InvalidateMaps(code); |
+ } |
+ current = code->next_code_link(); |
+ code->set_next_code_link(undefined); |
+ } |
+ map->set_dependent_ic(undefined); |
+} |
+ |
+ |
+void MarkCompactCollector::ClearNonLiveDependentIC(Map* map) { |
+ MarkCompactWeakObjectRetainer retainer; |
+ Object* head = |
+ VisitWeakList<Code>(heap(), map->dependent_ic(), &retainer, true); |
+ map->set_dependent_ic(head); |
+ Object** slot = HeapObject::RawField(map, Map::kDependentICOffset); |
+ RecordSlot(slot, slot, head); |
+} |
+ |
+ |
void MarkCompactCollector::ProcessWeakCollections() { |
GCTracer::Scope gc_scope(tracer_, GCTracer::Scope::MC_WEAKCOLLECTION_PROCESS); |
Object* weak_collection_obj = encountered_weak_collections(); |
@@ -3409,7 +3437,7 @@ void MarkCompactCollector::InvalidateCode(Code* code) { |
// Return true if the given code is deoptimized or will be deoptimized. |
bool MarkCompactCollector::WillBeDeoptimized(Code* code) { |
- return code->marked_for_deoptimization(); |
+ return code->is_optimized_code() && code->marked_for_deoptimization(); |
} |