OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 2163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2174 isolate()->global_handles()->IterateObjectGroups( | 2174 isolate()->global_handles()->IterateObjectGroups( |
2175 visitor, &IsUnmarkedHeapObjectWithHeap); | 2175 visitor, &IsUnmarkedHeapObjectWithHeap); |
2176 MarkImplicitRefGroups(); | 2176 MarkImplicitRefGroups(); |
2177 ProcessWeakMaps(); | 2177 ProcessWeakMaps(); |
2178 work_to_do = !marking_deque_.IsEmpty(); | 2178 work_to_do = !marking_deque_.IsEmpty(); |
2179 ProcessMarkingDeque(); | 2179 ProcessMarkingDeque(); |
2180 } | 2180 } |
2181 } | 2181 } |
2182 | 2182 |
2183 | 2183 |
2184 static StackFrame* TopOptimizedFrame(Isolate* isolate) { | |
2185 for (StackFrameIterator it(isolate, isolate->thread_local_top()); | |
2186 !it.done(); it.Advance()) { | |
2187 if (it.frame()->type() == StackFrame::JAVA_SCRIPT) { | |
2188 return NULL; | |
2189 } | |
2190 if (it.frame()->type() == StackFrame::OPTIMIZED) { | |
2191 return it.frame(); | |
2192 } | |
2193 } | |
2194 return NULL; | |
2195 } | |
2196 | |
2197 | |
2198 void MarkCompactCollector::ProcessTopOptimizedFrame(ObjectVisitor* visitor) { | 2184 void MarkCompactCollector::ProcessTopOptimizedFrame(ObjectVisitor* visitor) { |
2199 StackFrame* frame = TopOptimizedFrame(isolate()); | 2185 for (StackFrameIterator it(isolate(), isolate()->thread_local_top()); |
2200 if (frame != NULL) { | 2186 !it.done(); it.Advance()) { |
2201 Code* code = frame->LookupCode(); | 2187 if (it.frame()->type() == StackFrame::JAVA_SCRIPT) { |
2202 if (!code->CanDeoptAt(frame->pc())) { | 2188 return; |
2203 code->CodeIterateBody(visitor); | |
2204 } | 2189 } |
2205 ProcessMarkingDeque(); | 2190 if (it.frame()->type() == StackFrame::OPTIMIZED) { |
| 2191 Code* code = it.frame()->LookupCode(); |
| 2192 if (!code->CanDeoptAt(it.frame()->pc())) { |
| 2193 code->CodeIterateBody(visitor); |
| 2194 } |
| 2195 ProcessMarkingDeque(); |
| 2196 return; |
| 2197 } |
2206 } | 2198 } |
2207 } | 2199 } |
2208 | 2200 |
2209 | 2201 |
2210 void MarkCompactCollector::MarkLiveObjects() { | 2202 void MarkCompactCollector::MarkLiveObjects() { |
2211 GCTracer::Scope gc_scope(tracer_, GCTracer::Scope::MC_MARK); | 2203 GCTracer::Scope gc_scope(tracer_, GCTracer::Scope::MC_MARK); |
2212 // The recursive GC marker detects when it is nearing stack overflow, | 2204 // The recursive GC marker detects when it is nearing stack overflow, |
2213 // and switches to a different marking system. JS interrupts interfere | 2205 // and switches to a different marking system. JS interrupts interfere |
2214 // with the C stack limit check. | 2206 // with the C stack limit check. |
2215 PostponeInterruptsScope postpone(isolate()); | 2207 PostponeInterruptsScope postpone(isolate()); |
(...skipping 2098 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4314 while (buffer != NULL) { | 4306 while (buffer != NULL) { |
4315 SlotsBuffer* next_buffer = buffer->next(); | 4307 SlotsBuffer* next_buffer = buffer->next(); |
4316 DeallocateBuffer(buffer); | 4308 DeallocateBuffer(buffer); |
4317 buffer = next_buffer; | 4309 buffer = next_buffer; |
4318 } | 4310 } |
4319 *buffer_address = NULL; | 4311 *buffer_address = NULL; |
4320 } | 4312 } |
4321 | 4313 |
4322 | 4314 |
4323 } } // namespace v8::internal | 4315 } } // namespace v8::internal |
OLD | NEW |