| Index: src/heap/mark-compact.h
|
| diff --git a/src/heap/mark-compact.h b/src/heap/mark-compact.h
|
| index c489eaf3f4eab443dab32620ac9509c2ba03dd26..74a8b1831efb689e4b7815e7b2146c2063f996a6 100644
|
| --- a/src/heap/mark-compact.h
|
| +++ b/src/heap/mark-compact.h
|
| @@ -263,9 +263,10 @@
|
| // CodeFlusher collects candidates for code flushing during marking and
|
| // processes those candidates after marking has completed in order to
|
| // reset those functions referencing code objects that would otherwise
|
| -// be unreachable. Code objects can be referenced in two ways:
|
| +// be unreachable. Code objects can be referenced in three ways:
|
| // - SharedFunctionInfo references unoptimized code.
|
| // - JSFunction references either unoptimized or optimized code.
|
| +// - OptimizedCodeMap references optimized code.
|
| // We are not allowed to flush unoptimized code for functions that got
|
| // optimized or inlined into optimized code, because we might bailout
|
| // into the unoptimized code again during deoptimization.
|
| @@ -273,21 +274,26 @@
|
| public:
|
| explicit CodeFlusher(Isolate* isolate)
|
| : isolate_(isolate),
|
| - jsfunction_candidates_head_(nullptr),
|
| - shared_function_info_candidates_head_(nullptr) {}
|
| + jsfunction_candidates_head_(NULL),
|
| + shared_function_info_candidates_head_(NULL),
|
| + optimized_code_map_holder_head_(NULL) {}
|
|
|
| inline void AddCandidate(SharedFunctionInfo* shared_info);
|
| inline void AddCandidate(JSFunction* function);
|
| -
|
| + inline void AddOptimizedCodeMap(SharedFunctionInfo* code_map_holder);
|
| +
|
| + void EvictOptimizedCodeMap(SharedFunctionInfo* code_map_holder);
|
| void EvictCandidate(SharedFunctionInfo* shared_info);
|
| void EvictCandidate(JSFunction* function);
|
|
|
| void ProcessCandidates() {
|
| + ProcessOptimizedCodeMaps();
|
| ProcessSharedFunctionInfoCandidates();
|
| ProcessJSFunctionCandidates();
|
| }
|
|
|
| void EvictAllCandidates() {
|
| + EvictOptimizedCodeMaps();
|
| EvictJSFunctionCandidates();
|
| EvictSharedFunctionInfoCandidates();
|
| }
|
| @@ -295,8 +301,10 @@
|
| void IteratePointersToFromSpace(ObjectVisitor* v);
|
|
|
| private:
|
| + void ProcessOptimizedCodeMaps();
|
| void ProcessJSFunctionCandidates();
|
| void ProcessSharedFunctionInfoCandidates();
|
| + void EvictOptimizedCodeMaps();
|
| void EvictJSFunctionCandidates();
|
| void EvictSharedFunctionInfoCandidates();
|
|
|
| @@ -313,9 +321,15 @@
|
| SharedFunctionInfo* next_candidate);
|
| static inline void ClearNextCandidate(SharedFunctionInfo* candidate);
|
|
|
| + static inline SharedFunctionInfo* GetNextCodeMap(SharedFunctionInfo* holder);
|
| + static inline void SetNextCodeMap(SharedFunctionInfo* holder,
|
| + SharedFunctionInfo* next_holder);
|
| + static inline void ClearNextCodeMap(SharedFunctionInfo* holder);
|
| +
|
| Isolate* isolate_;
|
| JSFunction* jsfunction_candidates_head_;
|
| SharedFunctionInfo* shared_function_info_candidates_head_;
|
| + SharedFunctionInfo* optimized_code_map_holder_head_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(CodeFlusher);
|
| };
|
| @@ -680,13 +694,9 @@
|
| // collections when incremental marking is aborted.
|
| void AbortWeakCollections();
|
|
|
| +
|
| void ProcessAndClearWeakCells();
|
| void AbortWeakCells();
|
| -
|
| - // After all reachable objects have been marked, those entries within
|
| - // optimized code maps that became unreachable are removed, potentially
|
| - // trimming or clearing out the entire optimized code map.
|
| - void ProcessAndClearOptimizedCodeMaps();
|
|
|
| // -----------------------------------------------------------------------
|
| // Phase 2: Sweeping to clear mark bits and free non-live objects for
|
|
|