| OLD | NEW | 
|---|
| 1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 the V8 project authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "src/compiler-dispatcher/compiler-dispatcher-job.h" | 5 #include "src/compiler-dispatcher/compiler-dispatcher-job.h" | 
| 6 | 6 | 
| 7 #include "src/assert-scope.h" | 7 #include "src/assert-scope.h" | 
| 8 #include "src/compilation-info.h" | 8 #include "src/compilation-info.h" | 
| 9 #include "src/compiler-dispatcher/compiler-dispatcher-tracer.h" | 9 #include "src/compiler-dispatcher/compiler-dispatcher-tracer.h" | 
| 10 #include "src/compiler.h" | 10 #include "src/compiler.h" | 
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 59 | 59 | 
| 60   DISALLOW_COPY_AND_ASSIGN(TwoByteWrapper); | 60   DISALLOW_COPY_AND_ASSIGN(TwoByteWrapper); | 
| 61 }; | 61 }; | 
| 62 | 62 | 
| 63 }  // namespace | 63 }  // namespace | 
| 64 | 64 | 
| 65 CompilerDispatcherJob::CompilerDispatcherJob(Isolate* isolate, | 65 CompilerDispatcherJob::CompilerDispatcherJob(Isolate* isolate, | 
| 66                                              CompilerDispatcherTracer* tracer, | 66                                              CompilerDispatcherTracer* tracer, | 
| 67                                              Handle<SharedFunctionInfo> shared, | 67                                              Handle<SharedFunctionInfo> shared, | 
| 68                                              size_t max_stack_size) | 68                                              size_t max_stack_size) | 
| 69     : status_(CompileJobStatus::kInitial), | 69     : isolate_(isolate), | 
| 70       isolate_(isolate), |  | 
| 71       tracer_(tracer), | 70       tracer_(tracer), | 
| 72       shared_(Handle<SharedFunctionInfo>::cast( | 71       shared_(Handle<SharedFunctionInfo>::cast( | 
| 73           isolate_->global_handles()->Create(*shared))), | 72           isolate_->global_handles()->Create(*shared))), | 
| 74       max_stack_size_(max_stack_size), | 73       max_stack_size_(max_stack_size), | 
| 75       trace_compiler_dispatcher_jobs_(FLAG_trace_compiler_dispatcher_jobs) { | 74       trace_compiler_dispatcher_jobs_(FLAG_trace_compiler_dispatcher_jobs) { | 
| 76   HandleScope scope(isolate_); | 75   HandleScope scope(isolate_); | 
| 77   DCHECK(!shared_->outer_scope_info()->IsTheHole(isolate_)); | 76   DCHECK(!shared_->outer_scope_info()->IsTheHole(isolate_)); | 
| 78   Handle<Script> script(Script::cast(shared_->script()), isolate_); | 77   Handle<Script> script(Script::cast(shared_->script()), isolate_); | 
| 79   Handle<String> source(String::cast(script->source()), isolate_); | 78   Handle<String> source(String::cast(script->source()), isolate_); | 
| 80   if (trace_compiler_dispatcher_jobs_) { | 79   if (trace_compiler_dispatcher_jobs_) { | 
| 81     PrintF("CompilerDispatcherJob[%p] created for ", static_cast<void*>(this)); | 80     PrintF("CompilerDispatcherJob[%p] created for ", static_cast<void*>(this)); | 
| 82     shared_->ShortPrint(); | 81     shared_->ShortPrint(); | 
| 83     PrintF(" in initial state.\n"); | 82     PrintF("\n"); | 
| 84   } | 83   } | 
| 85 } | 84 } | 
| 86 | 85 | 
| 87 CompilerDispatcherJob::CompilerDispatcherJob(Isolate* isolate, |  | 
| 88                                              CompilerDispatcherTracer* tracer, |  | 
| 89                                              Handle<SharedFunctionInfo> shared, |  | 
| 90                                              FunctionLiteral* literal, |  | 
| 91                                              size_t max_stack_size) |  | 
| 92     : status_(CompileJobStatus::kAnalyzed), |  | 
| 93       isolate_(isolate), |  | 
| 94       tracer_(tracer), |  | 
| 95       shared_(Handle<SharedFunctionInfo>::cast( |  | 
| 96           isolate_->global_handles()->Create(*shared))), |  | 
| 97       max_stack_size_(max_stack_size), |  | 
| 98       zone_(new Zone(isolate->allocator(), ZONE_NAME)), |  | 
| 99       parse_info_(new ParseInfo( |  | 
| 100           zone_.get(), Handle<Script>(Script::cast(shared->script())))), |  | 
| 101       compile_info_( |  | 
| 102           new CompilationInfo(parse_info_.get(), Handle<JSFunction>::null())), |  | 
| 103       trace_compiler_dispatcher_jobs_(FLAG_trace_compiler_dispatcher_jobs) { |  | 
| 104   parse_info_->set_literal(literal); |  | 
| 105   parse_info_->set_shared_info(shared); |  | 
| 106   parse_info_->set_function_literal_id(shared->function_literal_id()); |  | 
| 107   parse_info_->set_language_mode(literal->scope()->language_mode()); |  | 
| 108   if (trace_compiler_dispatcher_jobs_) { |  | 
| 109     PrintF("CompilerDispatcherJob[%p] created for ", static_cast<void*>(this)); |  | 
| 110     shared_->ShortPrint(); |  | 
| 111     PrintF(" in Analyzed state.\n"); |  | 
| 112   } |  | 
| 113 } |  | 
| 114 |  | 
| 115 CompilerDispatcherJob::~CompilerDispatcherJob() { | 86 CompilerDispatcherJob::~CompilerDispatcherJob() { | 
| 116   DCHECK(ThreadId::Current().Equals(isolate_->thread_id())); | 87   DCHECK(ThreadId::Current().Equals(isolate_->thread_id())); | 
| 117   DCHECK(status_ == CompileJobStatus::kInitial || | 88   DCHECK(status_ == CompileJobStatus::kInitial || | 
| 118          status_ == CompileJobStatus::kDone); | 89          status_ == CompileJobStatus::kDone); | 
| 119   i::GlobalHandles::Destroy(Handle<Object>::cast(shared_).location()); | 90   i::GlobalHandles::Destroy(Handle<Object>::cast(shared_).location()); | 
| 120 } | 91 } | 
| 121 | 92 | 
| 122 bool CompilerDispatcherJob::IsAssociatedWith( | 93 bool CompilerDispatcherJob::IsAssociatedWith( | 
| 123     Handle<SharedFunctionInfo> shared) const { | 94     Handle<SharedFunctionInfo> shared) const { | 
| 124   return *shared_ == *shared; | 95   return *shared_ == *shared; | 
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 274     source_ = Handle<String>::null(); | 245     source_ = Handle<String>::null(); | 
| 275   } | 246   } | 
| 276   if (!wrapper_.is_null()) { | 247   if (!wrapper_.is_null()) { | 
| 277     i::GlobalHandles::Destroy(Handle<Object>::cast(wrapper_).location()); | 248     i::GlobalHandles::Destroy(Handle<Object>::cast(wrapper_).location()); | 
| 278     wrapper_ = Handle<String>::null(); | 249     wrapper_ = Handle<String>::null(); | 
| 279   } | 250   } | 
| 280 | 251 | 
| 281   if (parse_info_->literal() == nullptr) { | 252   if (parse_info_->literal() == nullptr) { | 
| 282     status_ = CompileJobStatus::kFailed; | 253     status_ = CompileJobStatus::kFailed; | 
| 283   } else { | 254   } else { | 
| 284     status_ = CompileJobStatus::kReadyToAnalyze; | 255     status_ = CompileJobStatus::kReadyToAnalyse; | 
| 285   } | 256   } | 
| 286 | 257 | 
| 287   DeferredHandleScope scope(isolate_); | 258   DeferredHandleScope scope(isolate_); | 
| 288   { | 259   { | 
| 289     Handle<Script> script(Script::cast(shared_->script()), isolate_); | 260     Handle<Script> script(Script::cast(shared_->script()), isolate_); | 
| 290 | 261 | 
| 291     parse_info_->set_script(script); | 262     parse_info_->set_script(script); | 
| 292     Handle<ScopeInfo> outer_scope_info( | 263     Handle<ScopeInfo> outer_scope_info( | 
| 293         handle(ScopeInfo::cast(shared_->outer_scope_info()))); | 264         handle(ScopeInfo::cast(shared_->outer_scope_info()))); | 
| 294     if (outer_scope_info->length() > 0) { | 265     if (outer_scope_info->length() > 0) { | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
| 305     parse_info_->set_unicode_cache(nullptr); | 276     parse_info_->set_unicode_cache(nullptr); | 
| 306     parser_.reset(); | 277     parser_.reset(); | 
| 307     unicode_cache_.reset(); | 278     unicode_cache_.reset(); | 
| 308     character_stream_.reset(); | 279     character_stream_.reset(); | 
| 309   } | 280   } | 
| 310   handles_from_parsing_.reset(scope.Detach()); | 281   handles_from_parsing_.reset(scope.Detach()); | 
| 311 | 282 | 
| 312   return status_ != CompileJobStatus::kFailed; | 283   return status_ != CompileJobStatus::kFailed; | 
| 313 } | 284 } | 
| 314 | 285 | 
| 315 bool CompilerDispatcherJob::AnalyzeOnMainThread() { | 286 bool CompilerDispatcherJob::PrepareToCompileOnMainThread() { | 
| 316   DCHECK(ThreadId::Current().Equals(isolate_->thread_id())); | 287   DCHECK(ThreadId::Current().Equals(isolate_->thread_id())); | 
| 317   DCHECK(status() == CompileJobStatus::kReadyToAnalyze); | 288   DCHECK(status() == CompileJobStatus::kReadyToAnalyse); | 
| 318   COMPILER_DISPATCHER_TRACE_SCOPE(tracer_, kAnalyze); | 289   COMPILER_DISPATCHER_TRACE_SCOPE(tracer_, kPrepareToCompile); | 
| 319   if (trace_compiler_dispatcher_jobs_) { | 290   if (trace_compiler_dispatcher_jobs_) { | 
| 320     PrintF("CompilerDispatcherJob[%p]: Analyzing\n", static_cast<void*>(this)); | 291     PrintF("CompilerDispatcherJob[%p]: Preparing to compile\n", | 
|  | 292            static_cast<void*>(this)); | 
| 321   } | 293   } | 
| 322 | 294 | 
| 323   compile_info_.reset( | 295   compile_info_.reset( | 
| 324       new CompilationInfo(parse_info_.get(), Handle<JSFunction>::null())); | 296       new CompilationInfo(parse_info_.get(), Handle<JSFunction>::null())); | 
| 325 | 297 | 
| 326   DeferredHandleScope scope(isolate_); | 298   DeferredHandleScope scope(isolate_); | 
| 327   { | 299   if (Compiler::Analyze(parse_info_.get())) { | 
| 328     if (Compiler::Analyze(parse_info_.get())) { | 300     compile_job_.reset( | 
| 329       status_ = CompileJobStatus::kAnalyzed; | 301         Compiler::PrepareUnoptimizedCompilationJob(compile_info_.get())); | 
| 330     } else { |  | 
| 331       status_ = CompileJobStatus::kFailed; |  | 
| 332       if (!isolate_->has_pending_exception()) isolate_->StackOverflow(); |  | 
| 333     } |  | 
| 334   } | 302   } | 
| 335   compile_info_->set_deferred_handles(scope.Detach()); | 303   compile_info_->set_deferred_handles(scope.Detach()); | 
| 336 | 304 | 
| 337   return status_ != CompileJobStatus::kFailed; |  | 
| 338 } |  | 
| 339 |  | 
| 340 bool CompilerDispatcherJob::PrepareToCompileOnMainThread() { |  | 
| 341   DCHECK(ThreadId::Current().Equals(isolate_->thread_id())); |  | 
| 342   DCHECK(status() == CompileJobStatus::kAnalyzed); |  | 
| 343   COMPILER_DISPATCHER_TRACE_SCOPE(tracer_, kPrepareToCompile); |  | 
| 344 |  | 
| 345   compile_job_.reset( |  | 
| 346       Compiler::PrepareUnoptimizedCompilationJob(compile_info_.get())); |  | 
| 347   if (!compile_job_.get()) { | 305   if (!compile_job_.get()) { | 
| 348     if (!isolate_->has_pending_exception()) isolate_->StackOverflow(); | 306     if (!isolate_->has_pending_exception()) isolate_->StackOverflow(); | 
| 349     status_ = CompileJobStatus::kFailed; | 307     status_ = CompileJobStatus::kFailed; | 
| 350     return false; | 308     return false; | 
| 351   } | 309   } | 
| 352 | 310 | 
| 353   CHECK(compile_job_->can_execute_on_background_thread()); | 311   CHECK(compile_job_->can_execute_on_background_thread()); | 
| 354   status_ = CompileJobStatus::kReadyToCompile; | 312   status_ = CompileJobStatus::kReadyToCompile; | 
| 355   return true; | 313   return true; | 
| 356 } | 314 } | 
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 436     case CompileJobStatus::kInitial: | 394     case CompileJobStatus::kInitial: | 
| 437       return tracer_->EstimatePrepareToParseInMs(); | 395       return tracer_->EstimatePrepareToParseInMs(); | 
| 438 | 396 | 
| 439     case CompileJobStatus::kReadyToParse: | 397     case CompileJobStatus::kReadyToParse: | 
| 440       return tracer_->EstimateParseInMs(parse_info_->end_position() - | 398       return tracer_->EstimateParseInMs(parse_info_->end_position() - | 
| 441                                         parse_info_->start_position()); | 399                                         parse_info_->start_position()); | 
| 442 | 400 | 
| 443     case CompileJobStatus::kParsed: | 401     case CompileJobStatus::kParsed: | 
| 444       return tracer_->EstimateFinalizeParsingInMs(); | 402       return tracer_->EstimateFinalizeParsingInMs(); | 
| 445 | 403 | 
| 446     case CompileJobStatus::kReadyToAnalyze: | 404     case CompileJobStatus::kReadyToAnalyse: | 
| 447       return tracer_->EstimateAnalyzeInMs(); |  | 
| 448 |  | 
| 449     case CompileJobStatus::kAnalyzed: |  | 
| 450       return tracer_->EstimatePrepareToCompileInMs(); | 405       return tracer_->EstimatePrepareToCompileInMs(); | 
| 451 | 406 | 
| 452     case CompileJobStatus::kReadyToCompile: | 407     case CompileJobStatus::kReadyToCompile: | 
| 453       return tracer_->EstimateCompileInMs( | 408       return tracer_->EstimateCompileInMs( | 
| 454           parse_info_->literal()->ast_node_count()); | 409           parse_info_->literal()->ast_node_count()); | 
| 455 | 410 | 
| 456     case CompileJobStatus::kCompiled: | 411     case CompileJobStatus::kCompiled: | 
| 457       return tracer_->EstimateFinalizeCompilingInMs(); | 412       return tracer_->EstimateFinalizeCompilingInMs(); | 
| 458 | 413 | 
| 459     case CompileJobStatus::kFailed: | 414     case CompileJobStatus::kFailed: | 
| 460     case CompileJobStatus::kDone: | 415     case CompileJobStatus::kDone: | 
| 461       return 0.0; | 416       return 0.0; | 
| 462   } | 417   } | 
| 463 | 418 | 
| 464   UNREACHABLE(); | 419   UNREACHABLE(); | 
| 465   return 0.0; | 420   return 0.0; | 
| 466 } | 421 } | 
| 467 | 422 | 
| 468 void CompilerDispatcherJob::ShortPrint() { | 423 void CompilerDispatcherJob::ShortPrint() { | 
| 469   DCHECK(ThreadId::Current().Equals(isolate_->thread_id())); | 424   DCHECK(ThreadId::Current().Equals(isolate_->thread_id())); | 
| 470   shared_->ShortPrint(); | 425   shared_->ShortPrint(); | 
| 471 } | 426 } | 
| 472 | 427 | 
| 473 }  // namespace internal | 428 }  // namespace internal | 
| 474 }  // namespace v8 | 429 }  // namespace v8 | 
| OLD | NEW | 
|---|