| Index: src/compiler-dispatcher/compiler-dispatcher-job.cc | 
| diff --git a/src/compiler-dispatcher/compiler-dispatcher-job.cc b/src/compiler-dispatcher/compiler-dispatcher-job.cc | 
| index 30493908447b8eaf5ae16a89e642519a76bf2eaf..6bbb1835f5d68cc26bdab8ba7d71f12dd9368d0e 100644 | 
| --- a/src/compiler-dispatcher/compiler-dispatcher-job.cc | 
| +++ b/src/compiler-dispatcher/compiler-dispatcher-job.cc | 
| @@ -66,7 +66,8 @@ CompilerDispatcherJob::CompilerDispatcherJob(Isolate* isolate, | 
| CompilerDispatcherTracer* tracer, | 
| Handle<SharedFunctionInfo> shared, | 
| size_t max_stack_size) | 
| -    : isolate_(isolate), | 
| +    : status_(CompileJobStatus::kInitial), | 
| +      isolate_(isolate), | 
| tracer_(tracer), | 
| shared_(Handle<SharedFunctionInfo>::cast( | 
| isolate_->global_handles()->Create(*shared))), | 
| @@ -79,7 +80,35 @@ CompilerDispatcherJob::CompilerDispatcherJob(Isolate* isolate, | 
| if (trace_compiler_dispatcher_jobs_) { | 
| PrintF("CompilerDispatcherJob[%p] created for ", static_cast<void*>(this)); | 
| shared_->ShortPrint(); | 
| -    PrintF("\n"); | 
| +    PrintF(" in initial state.\n"); | 
| +  } | 
| +} | 
| + | 
| +CompilerDispatcherJob::CompilerDispatcherJob(Isolate* isolate, | 
| +                                             CompilerDispatcherTracer* tracer, | 
| +                                             Handle<SharedFunctionInfo> shared, | 
| +                                             FunctionLiteral* literal, | 
| +                                             size_t max_stack_size) | 
| +    : status_(CompileJobStatus::kAnalyzed), | 
| +      isolate_(isolate), | 
| +      tracer_(tracer), | 
| +      shared_(Handle<SharedFunctionInfo>::cast( | 
| +          isolate_->global_handles()->Create(*shared))), | 
| +      max_stack_size_(max_stack_size), | 
| +      zone_(new Zone(isolate->allocator(), ZONE_NAME)), | 
| +      parse_info_(new ParseInfo( | 
| +          zone_.get(), Handle<Script>(Script::cast(shared->script())))), | 
| +      compile_info_( | 
| +          new CompilationInfo(parse_info_.get(), Handle<JSFunction>::null())), | 
| +      trace_compiler_dispatcher_jobs_(FLAG_trace_compiler_dispatcher_jobs) { | 
| +  parse_info_->set_literal(literal); | 
| +  parse_info_->set_shared_info(shared); | 
| +  parse_info_->set_function_literal_id(shared->function_literal_id()); | 
| +  parse_info_->set_language_mode(literal->scope()->language_mode()); | 
| +  if (trace_compiler_dispatcher_jobs_) { | 
| +    PrintF("CompilerDispatcherJob[%p] created for ", static_cast<void*>(this)); | 
| +    shared_->ShortPrint(); | 
| +    PrintF(" in Analyzed state.\n"); | 
| } | 
| } | 
|  | 
| @@ -252,7 +281,7 @@ bool CompilerDispatcherJob::FinalizeParsingOnMainThread() { | 
| if (parse_info_->literal() == nullptr) { | 
| status_ = CompileJobStatus::kFailed; | 
| } else { | 
| -    status_ = CompileJobStatus::kReadyToAnalyse; | 
| +    status_ = CompileJobStatus::kReadyToAnalyze; | 
| } | 
|  | 
| DeferredHandleScope scope(isolate_); | 
| @@ -283,25 +312,38 @@ bool CompilerDispatcherJob::FinalizeParsingOnMainThread() { | 
| return status_ != CompileJobStatus::kFailed; | 
| } | 
|  | 
| -bool CompilerDispatcherJob::PrepareToCompileOnMainThread() { | 
| +bool CompilerDispatcherJob::AnalyzeOnMainThread() { | 
| DCHECK(ThreadId::Current().Equals(isolate_->thread_id())); | 
| -  DCHECK(status() == CompileJobStatus::kReadyToAnalyse); | 
| -  COMPILER_DISPATCHER_TRACE_SCOPE(tracer_, kPrepareToCompile); | 
| +  DCHECK(status() == CompileJobStatus::kReadyToAnalyze); | 
| +  COMPILER_DISPATCHER_TRACE_SCOPE(tracer_, kAnalyze); | 
| if (trace_compiler_dispatcher_jobs_) { | 
| -    PrintF("CompilerDispatcherJob[%p]: Preparing to compile\n", | 
| -           static_cast<void*>(this)); | 
| +    PrintF("CompilerDispatcherJob[%p]: Analyzing\n", static_cast<void*>(this)); | 
| } | 
|  | 
| compile_info_.reset( | 
| new CompilationInfo(parse_info_.get(), Handle<JSFunction>::null())); | 
|  | 
| DeferredHandleScope scope(isolate_); | 
| -  if (Compiler::Analyze(parse_info_.get())) { | 
| -    compile_job_.reset( | 
| -        Compiler::PrepareUnoptimizedCompilationJob(compile_info_.get())); | 
| +  { | 
| +    if (Compiler::Analyze(parse_info_.get())) { | 
| +      status_ = CompileJobStatus::kAnalyzed; | 
| +    } else { | 
| +      status_ = CompileJobStatus::kFailed; | 
| +      if (!isolate_->has_pending_exception()) isolate_->StackOverflow(); | 
| +    } | 
| } | 
| compile_info_->set_deferred_handles(scope.Detach()); | 
|  | 
| +  return status_ != CompileJobStatus::kFailed; | 
| +} | 
| + | 
| +bool CompilerDispatcherJob::PrepareToCompileOnMainThread() { | 
| +  DCHECK(ThreadId::Current().Equals(isolate_->thread_id())); | 
| +  DCHECK(status() == CompileJobStatus::kAnalyzed); | 
| +  COMPILER_DISPATCHER_TRACE_SCOPE(tracer_, kPrepareToCompile); | 
| + | 
| +  compile_job_.reset( | 
| +      Compiler::PrepareUnoptimizedCompilationJob(compile_info_.get())); | 
| if (!compile_job_.get()) { | 
| if (!isolate_->has_pending_exception()) isolate_->StackOverflow(); | 
| status_ = CompileJobStatus::kFailed; | 
| @@ -401,7 +443,10 @@ double CompilerDispatcherJob::EstimateRuntimeOfNextStepInMs() const { | 
| case CompileJobStatus::kParsed: | 
| return tracer_->EstimateFinalizeParsingInMs(); | 
|  | 
| -    case CompileJobStatus::kReadyToAnalyse: | 
| +    case CompileJobStatus::kReadyToAnalyze: | 
| +      return tracer_->EstimateAnalyzeInMs(); | 
| + | 
| +    case CompileJobStatus::kAnalyzed: | 
| return tracer_->EstimatePrepareToCompileInMs(); | 
|  | 
| case CompileJobStatus::kReadyToCompile: | 
|  |