| Index: runtime/vm/compiler.cc
|
| ===================================================================
|
| --- runtime/vm/compiler.cc (revision 6601)
|
| +++ runtime/vm/compiler.cc (working copy)
|
| @@ -108,6 +108,25 @@
|
| }
|
|
|
|
|
| +static void InstallUnoptimizedCode(const Function& function) {
|
| + // Disable optimized code.
|
| + ASSERT(function.HasOptimizedCode());
|
| + // Patch entry of optimized code.
|
| + CodePatcher::PatchEntry(Code::Handle(function.CurrentCode()));
|
| + if (FLAG_trace_compiler) {
|
| + OS::Print("--> patching entry 0x%x\n",
|
| + Code::Handle(function.CurrentCode()).EntryPoint());
|
| + }
|
| + // Use previously compiled code.
|
| + function.SetCode(Code::Handle(function.unoptimized_code()));
|
| + CodePatcher::RestoreEntry(Code::Handle(function.unoptimized_code()));
|
| + if (FLAG_trace_compiler) {
|
| + OS::Print("--> restoring entry at 0x%x\n",
|
| + Code::Handle(function.unoptimized_code()).EntryPoint());
|
| + }
|
| +}
|
| +
|
| +
|
| static RawError* CompileFunctionHelper(const Function& function,
|
| bool optimized) {
|
| Isolate* isolate = Isolate::Current();
|
| @@ -115,6 +134,11 @@
|
| LongJump* base = isolate->long_jump_base();
|
| LongJump jump;
|
| isolate->set_long_jump_base(&jump);
|
| + // Skips parsing if we need to only install unoptimized code.
|
| + if (!optimized && !Code::Handle(function.unoptimized_code()).IsNull()) {
|
| + InstallUnoptimizedCode(function);
|
| + return Error::null();
|
| + }
|
| if (setjmp(*jump.Set()) == 0) {
|
| TIMERSCOPE(time_compilation);
|
| ParsedFunction parsed_function(function);
|
| @@ -129,7 +153,6 @@
|
| parsed_function.AllocateVariables();
|
|
|
| TimerScope timer(FLAG_compiler_stats, &CompilerStats::codegen_timer);
|
| -
|
| bool is_compiled = false;
|
| if (FLAG_use_new_compiler) {
|
| ASSERT(!optimized);
|
| @@ -204,39 +227,21 @@
|
| Code::Handle(function.unoptimized_code()).EntryPoint());
|
| }
|
| } else {
|
| - // Unoptimized code.
|
| - if (Code::Handle(function.unoptimized_code()).IsNull()) {
|
| - ASSERT(!function.HasCode());
|
| - // Compiling first time.
|
| - CodeGenerator code_gen(&assembler, parsed_function);
|
| - code_gen.GenerateCode();
|
| - const Code& code =
|
| - Code::Handle(Code::FinalizeCode(function_fullname, &assembler));
|
| - code.set_is_optimized(false);
|
| - code_gen.FinalizePcDescriptors(code);
|
| - code_gen.FinalizeStackmaps(code);
|
| - code_gen.FinalizeVarDescriptors(code);
|
| - code_gen.FinalizeExceptionHandlers(code);
|
| - function.set_unoptimized_code(code);
|
| - function.SetCode(code);
|
| - ASSERT(CodePatcher::CodeIsPatchable(code));
|
| - } else {
|
| - // Disable optimized code.
|
| - ASSERT(function.HasOptimizedCode());
|
| - // Patch entry of optimized code.
|
| - CodePatcher::PatchEntry(Code::Handle(function.CurrentCode()));
|
| - if (FLAG_trace_compiler) {
|
| - OS::Print("--> patching entry 0x%x\n",
|
| - Code::Handle(function.CurrentCode()).EntryPoint());
|
| - }
|
| - // Use previously compiled code.
|
| - function.SetCode(Code::Handle(function.unoptimized_code()));
|
| - CodePatcher::RestoreEntry(Code::Handle(function.unoptimized_code()));
|
| - if (FLAG_trace_compiler) {
|
| - OS::Print("--> restoring entry at 0x%x\n",
|
| - Code::Handle(function.unoptimized_code()).EntryPoint());
|
| - }
|
| - }
|
| + // Compile unnoptimized code.
|
| + ASSERT(!function.HasCode());
|
| + // Compiling first time.
|
| + CodeGenerator code_gen(&assembler, parsed_function);
|
| + code_gen.GenerateCode();
|
| + const Code& code =
|
| + Code::Handle(Code::FinalizeCode(function_fullname, &assembler));
|
| + code.set_is_optimized(false);
|
| + code_gen.FinalizePcDescriptors(code);
|
| + code_gen.FinalizeStackmaps(code);
|
| + code_gen.FinalizeVarDescriptors(code);
|
| + code_gen.FinalizeExceptionHandlers(code);
|
| + function.set_unoptimized_code(code);
|
| + function.SetCode(code);
|
| + ASSERT(CodePatcher::CodeIsPatchable(code));
|
| }
|
| }
|
| if (FLAG_trace_compiler) {
|
| @@ -304,12 +309,12 @@
|
|
|
|
|
| RawError* Compiler::CompileFunction(const Function& function) {
|
| - return CompileFunctionHelper(function, false);
|
| + return CompileFunctionHelper(function, false); // Non-optimized.
|
| }
|
|
|
|
|
| RawError* Compiler::CompileOptimizedFunction(const Function& function) {
|
| - return CompileFunctionHelper(function, true);
|
| + return CompileFunctionHelper(function, true); // Optimized.
|
| }
|
|
|
|
|
|
|