Index: src/heap/objects-visiting-inl.h |
diff --git a/src/heap/objects-visiting-inl.h b/src/heap/objects-visiting-inl.h |
index 80f3a37f921f77523d1558e8a045b07b284a63b6..0e025b22f2af61dabef81bca9136b518c162fc2d 100644 |
--- a/src/heap/objects-visiting-inl.h |
+++ b/src/heap/objects-visiting-inl.h |
@@ -442,6 +442,14 @@ void StaticMarkingVisitor<StaticVisitor>::VisitSharedFunctionInfo( |
// Always flush the optimized code map if requested by flag. |
shared->ClearOptimizedCodeMap(); |
} |
+ } else { |
+ if (!shared->OptimizedCodeMapIsCleared()) { |
+ // Treat some references within the code map weakly by marking the |
+ // code map itself but not pushing it onto the marking deque. The |
+ // map will be processed after marking. |
+ FixedArray* code_map = shared->optimized_code_map(); |
+ MarkOptimizedCodeMap(heap, code_map); |
+ } |
} |
MarkCompactCollector* collector = heap->mark_compact_collector(); |
if (collector->is_code_flushing_enabled()) { |
@@ -581,6 +589,23 @@ void StaticMarkingVisitor<StaticVisitor>::MarkTransitionArray( |
template <typename StaticVisitor> |
+void StaticMarkingVisitor<StaticVisitor>::MarkOptimizedCodeMap( |
+ Heap* heap, FixedArray* code_map) { |
+ if (!StaticVisitor::MarkObjectWithoutPush(heap, code_map)) return; |
+ |
+ // Mark the context-independent entry in the optimized code map. Depending on |
+ // the age of the code object, we treat it as a strong or a weak reference. |
+ Object* shared_object = code_map->get(SharedFunctionInfo::kSharedCodeIndex); |
+ if (FLAG_turbo_preserve_shared_code && shared_object->IsCode() && |
+ FLAG_age_code && !Code::cast(shared_object)->IsOld()) { |
+ StaticVisitor::VisitPointer( |
+ heap, code_map, |
+ code_map->RawFieldOfElementAt(SharedFunctionInfo::kSharedCodeIndex)); |
+ } |
+} |
+ |
+ |
+template <typename StaticVisitor> |
void StaticMarkingVisitor<StaticVisitor>::MarkInlinedFunctionsCode(Heap* heap, |
Code* code) { |
// For optimized functions we should retain both non-optimized version |