Chromium Code Reviews| Index: src/mark-compact.cc |
| diff --git a/src/mark-compact.cc b/src/mark-compact.cc |
| index 0501ccf5805a0c752a01c4876895ba2b7863bf53..8f64aeb731ff7c57d7af57a2020dd0ec4c4e4aa5 100644 |
| --- a/src/mark-compact.cc |
| +++ b/src/mark-compact.cc |
| @@ -2199,6 +2199,32 @@ void MarkCompactCollector::ProcessEphemeralMarking(ObjectVisitor* visitor) { |
| } |
| +static StackFrame* TopOptimizedFrame(Isolate* isolate) { |
| + for (StackFrameIterator it(isolate, isolate->thread_local_top()); |
| + !it.done(); it.Advance()) { |
| + if (it.frame()->type() == StackFrame::JAVA_SCRIPT) { |
| + return NULL; |
| + } |
| + if (it.frame()->type() == StackFrame::OPTIMIZED) { |
| + return it.frame(); |
| + } |
| + } |
| + return NULL; |
| +} |
| + |
| + |
| +void MarkCompactCollector::ProcessTopOptimizedFrame(ObjectVisitor* visitor) { |
| + StackFrame* frame = TopOptimizedFrame(isolate()); |
| + if (frame) { |
|
Michael Starzinger
2013/07/02 15:03:44
nit: s/frame/frame != NULL/
ulan
2013/07/02 15:06:36
Done.
|
| + Code* code = frame->LookupCode(); |
| + if (!code->CanDeoptAt(frame->pc())) { |
| + code->CodeIterateBody(visitor); |
| + } |
| + } |
| + ProcessMarkingDeque(); |
|
Michael Starzinger
2013/07/02 15:03:44
nit: Move the processing of the marking deque into
ulan
2013/07/02 15:06:36
Done.
|
| +} |
| + |
| + |
| void MarkCompactCollector::MarkLiveObjects() { |
| GCTracer::Scope gc_scope(tracer_, GCTracer::Scope::MC_MARK); |
| // The recursive GC marker detects when it is nearing stack overflow, |
| @@ -2285,6 +2311,8 @@ void MarkCompactCollector::MarkLiveObjects() { |
| RootMarkingVisitor root_visitor(heap()); |
| MarkRoots(&root_visitor); |
| + ProcessTopOptimizedFrame(&root_visitor); |
| + |
| // The objects reachable from the roots are marked, yet unreachable |
| // objects are unmarked. Mark objects reachable due to host |
| // application specific logic or through Harmony weak maps. |