Index: src/heap/objects-visiting-inl.h |
diff --git a/src/heap/objects-visiting-inl.h b/src/heap/objects-visiting-inl.h |
index e3e8e710203ea03bdb376d97a03d6ba6722326bb..05aa375bcdb042f30e1d9c672e6c3876283f30f5 100644 |
--- a/src/heap/objects-visiting-inl.h |
+++ b/src/heap/objects-visiting-inl.h |
@@ -419,10 +419,10 @@ void StaticMarkingVisitor<StaticVisitor>::VisitSharedFunctionInfo( |
// Add the shared function info holding an optimized code map to |
// the code flusher for processing of code maps after marking. |
collector->code_flusher()->AddOptimizedCodeMap(shared); |
- // Treat all references within the code map weakly by marking the |
+ // Treat some references within the code map weakly by marking the |
// code map itself but not pushing it onto the marking deque. |
FixedArray* code_map = FixedArray::cast(shared->optimized_code_map()); |
- StaticVisitor::MarkObjectWithoutPush(heap, code_map); |
+ MarkOptimizedCodeMap(heap, code_map); |
} |
if (IsFlushable(heap, shared)) { |
// This function's code looks flushable. But we have to postpone |
@@ -589,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->RawFieldOfElementAt(SharedFunctionInfo::kSharedCodeIndex)); |
+ } |
+} |
+ |
+ |
+template <typename StaticVisitor> |
void StaticMarkingVisitor<StaticVisitor>::MarkInlinedFunctionsCode(Heap* heap, |
Code* code) { |
// For optimized functions we should retain both non-optimized version |