| Index: runtime/vm/precompiler.cc
|
| diff --git a/runtime/vm/precompiler.cc b/runtime/vm/precompiler.cc
|
| index 3d69d951389e1f5ed6fbe250abe78592b257b13d..52c6e88671ddb5564c4a180f095758137688e4ab 100644
|
| --- a/runtime/vm/precompiler.cc
|
| +++ b/runtime/vm/precompiler.cc
|
| @@ -192,62 +192,63 @@ void Precompiler::DoCompileAll(
|
| StackZone stack_zone(T);
|
| zone_ = stack_zone.GetZone();
|
|
|
| - // Make sure class hierarchy is stable before compilation so that CHA
|
| - // can be used. Also ensures lookup of entry points won't miss functions
|
| - // because their class hasn't been finalized yet.
|
| - FinalizeAllClasses();
|
| + { HANDLESCOPE(T);
|
| + // Make sure class hierarchy is stable before compilation so that CHA
|
| + // can be used. Also ensures lookup of entry points won't miss functions
|
| + // because their class hasn't been finalized yet.
|
| + FinalizeAllClasses();
|
|
|
| - // Precompile static initializers to compute result type information.
|
| - PrecompileStaticInitializers();
|
| + // Precompile static initializers to compute result type information.
|
| + PrecompileStaticInitializers();
|
|
|
| - for (intptr_t round = 0; round < FLAG_precompiler_rounds; round++) {
|
| - if (FLAG_trace_precompiler) {
|
| - THR_Print("Precompiler round %" Pd "\n", round);
|
| - }
|
| -
|
| - if (round > 0) {
|
| - ResetPrecompilerState();
|
| - }
|
| -
|
| - // TODO(rmacnak): We should be able to do a more thorough job and drop
|
| - // some
|
| - // - implicit static closures
|
| - // - field initializers
|
| - // - invoke-field-dispatchers
|
| - // - method-extractors
|
| - // that are needed in early iterations but optimized away in later
|
| - // iterations.
|
| - ClearAllCode();
|
| -
|
| - CollectDynamicFunctionNames();
|
| + for (intptr_t round = 0; round < FLAG_precompiler_rounds; round++) {
|
| + if (FLAG_trace_precompiler) {
|
| + THR_Print("Precompiler round %" Pd "\n", round);
|
| + }
|
|
|
| - // Start with the allocations and invocations that happen from C++.
|
| - AddRoots(embedder_entry_points);
|
| + if (round > 0) {
|
| + ResetPrecompilerState();
|
| + }
|
|
|
| - // Compile newly found targets and add their callees until we reach a
|
| - // fixed point.
|
| - Iterate();
|
| + // TODO(rmacnak): We should be able to do a more thorough job and drop
|
| + // some
|
| + // - implicit static closures
|
| + // - field initializers
|
| + // - invoke-field-dispatchers
|
| + // - method-extractors
|
| + // that are needed in early iterations but optimized away in later
|
| + // iterations.
|
| + ClearAllCode();
|
| +
|
| + CollectDynamicFunctionNames();
|
| +
|
| + // Start with the allocations and invocations that happen from C++.
|
| + AddRoots(embedder_entry_points);
|
| +
|
| + // Compile newly found targets and add their callees until we reach a
|
| + // fixed point.
|
| + Iterate();
|
| + }
|
| +
|
| + I->set_compilation_allowed(false);
|
| +
|
| + TraceForRetainedFunctions();
|
| + DropFunctions();
|
| + DropFields();
|
| + TraceTypesFromRetainedClasses();
|
| + DropTypes();
|
| + DropTypeArguments();
|
| +
|
| + // Clear these before dropping classes as they may hold onto otherwise
|
| + // dead instances of classes we will remove.
|
| + I->object_store()->set_compile_time_constants(Array::null_array());
|
| + I->object_store()->set_unique_dynamic_targets(Array::null_array());
|
| + Class& null_class = Class::Handle(Z);
|
| + I->object_store()->set_future_class(null_class);
|
| + I->object_store()->set_completer_class(null_class);
|
| + I->object_store()->set_stream_iterator_class(null_class);
|
| + I->object_store()->set_symbol_class(null_class);
|
| }
|
| -
|
| - I->set_compilation_allowed(false);
|
| -
|
| - TraceForRetainedFunctions();
|
| - DropFunctions();
|
| - DropFields();
|
| - TraceTypesFromRetainedClasses();
|
| - DropTypes();
|
| - DropTypeArguments();
|
| -
|
| - // Clear these before dropping classes as they may hold onto otherwise
|
| - // dead instances of classes we will remove.
|
| - I->object_store()->set_compile_time_constants(Array::null_array());
|
| - I->object_store()->set_unique_dynamic_targets(Array::null_array());
|
| - Class& null_class = Class::Handle(Z);
|
| - I->object_store()->set_future_class(null_class);
|
| - I->object_store()->set_completer_class(null_class);
|
| - I->object_store()->set_stream_iterator_class(null_class);
|
| - I->object_store()->set_symbol_class(null_class);
|
| -
|
| DropClasses();
|
| DropLibraries();
|
|
|
| @@ -329,6 +330,8 @@ void Precompiler::PrecompileStaticInitializers() {
|
| Field& field_;
|
| Function& function_;
|
| };
|
| +
|
| + HANDLESCOPE(T);
|
| StaticInitializerVisitor visitor(Z);
|
| VisitClasses(&visitor);
|
| }
|
|
|