| Index: src/deoptimizer.cc
|
| diff --git a/src/deoptimizer.cc b/src/deoptimizer.cc
|
| index 3debf55cd6510a2d3322d3e55f04e0f1bf0977cb..af0a171db78c430205da155ac54e0c393f2b45d6 100644
|
| --- a/src/deoptimizer.cc
|
| +++ b/src/deoptimizer.cc
|
| @@ -268,20 +268,29 @@ 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. This is needed because
|
| + // visitors might remove more than one link from the list at once.
|
| + 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);
|
| }
|
|
|
|
|