| 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();
|
| }
|
|
|
|
|
|
|