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