Index: src/deoptimizer.cc |
diff --git a/src/deoptimizer.cc b/src/deoptimizer.cc |
index 3debf55cd6510a2d3322d3e55f04e0f1bf0977cb..db84914a5a63b7063d861039a93260a36698fed5 100644 |
--- a/src/deoptimizer.cc |
+++ b/src/deoptimizer.cc |
@@ -268,20 +268,28 @@ void Deoptimizer::DeoptimizeGlobalObject(JSObject* object) { |
void Deoptimizer::VisitAllOptimizedFunctionsForContext( |
Context* context, OptimizedFunctionVisitor* visitor) { |
+ Isolate* isolate = context->GetIsolate(); |
+ ZoneScope zone_scope(isolate, DELETE_ON_EXIT); |
AssertNoAllocation no_allocation; |
ASSERT(context->IsGlobalContext()); |
visitor->EnterContext(context); |
- // Run through the list of optimized functions and deoptimize them. |
+ |
+ // Create a snapshot of the optimized functions list. |
Florian Schneider
2012/06/15 10:31:47
Maybe add to the comment why this was necessary: V
Michael Starzinger
2012/06/15 10:36:34
Done.
|
+ ZoneList<JSFunction*> snapshot(1, isolate->zone()); |
Object* element = context->OptimizedFunctionsListHead(); |
while (!element->IsUndefined()) { |
JSFunction* element_function = JSFunction::cast(element); |
- // Get the next link before deoptimizing as deoptimizing will clear the |
- // next link. |
+ snapshot.Add(element_function, isolate->zone()); |
element = element_function->next_function_link(); |
- visitor->VisitFunction(element_function); |
} |
+ |
+ // Run through the snapshot of optimized functions and visit them. |
+ for (int i = 0; i < snapshot.length(); ++i) { |
+ visitor->VisitFunction(snapshot.at(i)); |
+ } |
+ |
visitor->LeaveContext(context); |
} |