| 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.
 | 
|  }
 | 
|  
 | 
|  
 | 
| 
 |