Chromium Code Reviews| Index: runtime/vm/compiler.cc |
| =================================================================== |
| --- runtime/vm/compiler.cc (revision 39070) |
| +++ runtime/vm/compiler.cc (working copy) |
| @@ -8,6 +8,7 @@ |
| #include "vm/ast_printer.h" |
| #include "vm/block_scheduler.h" |
| +#include "vm/cha.h" |
| #include "vm/code_generator.h" |
| #include "vm/code_patcher.h" |
| #include "vm/dart_entry.h" |
| @@ -252,7 +253,6 @@ |
| bool is_compiled = false; |
| Isolate* isolate = Isolate::Current(); |
| HANDLESCOPE(isolate); |
| - isolate->set_cha_used(false); |
| // We may reattempt compilation if the function needs to be assembled using |
| // far branches on ARM and MIPS. In the else branch of the setjmp call, |
| @@ -269,6 +269,11 @@ |
| LongJumpScope jump; |
| if (setjmp(*jump.Set()) == 0) { |
| FlowGraph* flow_graph = NULL; |
| + |
| + // Class hierarchy analysis is registered with the isolate in the |
| + // constructor and unregisters itself upon destruction. |
| + CHA cha(isolate); |
| + |
| // TimerScope needs an isolate to be properly terminated in case of a |
| // LongJump. |
| { |
| @@ -286,6 +291,7 @@ |
| function.RestoreICDataMap(ic_data_array); |
| } |
| + |
| // Build the flow graph. |
| FlowGraphBuilder builder(parsed_function, |
| *ic_data_array, |
| @@ -545,12 +551,6 @@ |
| const Code& code = Code::Handle( |
| Code::FinalizeCode(function, &assembler, optimized)); |
| code.set_is_optimized(optimized); |
| - // CHA should not be used for unoptimized code. |
| - ASSERT(optimized || !isolate->cha_used()); |
| - if (isolate->cha_used()) { |
| - Class::Handle(function.Owner()).RegisterCHACode(code); |
| - isolate->set_cha_used(false); |
| - } |
| graph_compiler.FinalizePcDescriptors(code); |
| graph_compiler.FinalizeDeoptInfo(code); |
| graph_compiler.FinalizeStackmaps(code); |
| @@ -572,7 +572,14 @@ |
| } |
| function.AttachCode(code); |
| + // Register code with the classes it depends on because of CHA. |
| for (intptr_t i = 0; |
| + i < isolate->cha()->cha_classes().length(); |
| + ++i) { |
| + isolate->cha()->cha_classes()[i]->RegisterCHACode(code); |
|
Florian Schneider
2014/08/12 11:37:10
This fixes bug #2: The optimized code is now regis
|
| + } |
| + |
| + for (intptr_t i = 0; |
| i < flow_graph->guarded_fields()->length(); |
| i++) { |
| const Field* field = (*flow_graph->guarded_fields())[i]; |