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 923793665aa3cd503ab554ada9fcf67f00b4e662..3ede6ca6f1a63fd395afb4ca5a0bc9da87b9b450 100644 |
--- a/src/compiler-dispatcher/compiler-dispatcher-job.cc |
+++ b/src/compiler-dispatcher/compiler-dispatcher-job.cc |
@@ -5,6 +5,7 @@ |
#include "src/compiler-dispatcher/compiler-dispatcher-job.h" |
#include "src/assert-scope.h" |
+#include "src/compiler.h" |
#include "src/global-handles.h" |
#include "src/isolate.h" |
#include "src/objects-inl.h" |
@@ -131,7 +132,7 @@ bool CompilerDispatcherJob::FinalizeParsingOnMainThread() { |
if (parse_info_->literal() == nullptr) { |
status_ = CompileJobStatus::kFailed; |
} else { |
- status_ = CompileJobStatus::kReadyToCompile; |
+ status_ = CompileJobStatus::kReadyToAnalyse; |
} |
DeferredHandleScope scope(isolate_); |
@@ -146,6 +147,7 @@ bool CompilerDispatcherJob::FinalizeParsingOnMainThread() { |
parse_info_->set_script(script); |
parse_info_->set_context(handle(function_->context(), isolate_)); |
+ parse_info_->set_shared_info(handle(function_->shared(), isolate_)); |
// Do the parsing tasks which need to be done on the main thread. This will |
// also handle parse errors. |
@@ -163,6 +165,78 @@ bool CompilerDispatcherJob::FinalizeParsingOnMainThread() { |
return status_ != CompileJobStatus::kFailed; |
} |
+bool CompilerDispatcherJob::PrepareToCompileOnMainThread() { |
+ DCHECK(ThreadId::Current().Equals(isolate_->thread_id())); |
+ DCHECK(status() == CompileJobStatus::kReadyToAnalyse); |
+ |
+ compile_info_.reset(new CompilationInfo(parse_info_.get(), function_)); |
+ |
+ DeferredHandleScope scope(isolate_); |
+ { |
+ // Create a canonical handle scope before ast numbering if compiling |
+ // bytecode. This is required for off-thread bytecode generation. |
+ std::unique_ptr<CanonicalHandleScope> canonical; |
+ if (FLAG_ignition) canonical.reset(new CanonicalHandleScope(isolate_)); |
+ |
+ if (Compiler::Analyze(parse_info_.get())) { |
+ compile_job_.reset( |
+ Compiler::PrepareUnoptimizedCompilationJob(compile_info_.get())); |
+ } |
+ } |
+ handles_from_analysing_.reset(scope.Detach()); |
jochen (gone - plz use gerrit)
2016/08/23 16:06:22
why not just compile_info_->set_deferred_handles(s
rmcilroy
2016/08/23 16:58:29
Works for me. Done.
|
+ |
+ if (!compile_job_.get()) { |
+ if (!isolate_->has_pending_exception()) isolate_->StackOverflow(); |
+ status_ = CompileJobStatus::kFailed; |
+ return false; |
+ } |
+ |
+ status_ = CompileJobStatus::kReadyToCompile; |
+ return true; |
+} |
+ |
+void CompilerDispatcherJob::Compile() { |
+ DCHECK(status() == CompileJobStatus::kReadyToCompile); |
+ DCHECK(compile_job_->can_execute_on_background_thread() || |
+ ThreadId::Current().Equals(isolate_->thread_id())); |
+ |
+ // Disallowing of handle dereference and heap access dealt with in |
+ // CompilationJob::ExecuteJob. |
+ |
+ uintptr_t stack_limit = |
+ reinterpret_cast<uintptr_t>(&stack_limit) - max_stack_size_ * KB; |
+ compile_job_->set_stack_limit(stack_limit); |
+ |
+ CompilationJob::Status status = compile_job_->ExecuteJob(); |
+ USE(status); |
+ |
+ // Always transition to kCompiled - errors will be reported by |
+ // FinalizeCompilingOnMainThread. |
+ status_ = CompileJobStatus::kCompiled; |
+} |
+ |
+bool CompilerDispatcherJob::FinalizeCompilingOnMainThread() { |
+ DCHECK(ThreadId::Current().Equals(isolate_->thread_id())); |
+ DCHECK(status() == CompileJobStatus::kCompiled); |
+ |
+ if (compile_job_->state() == CompilationJob::State::kFailed || |
+ !Compiler::FinalizeCompilationJob(compile_job_.release())) { |
+ if (!isolate_->has_pending_exception()) isolate_->StackOverflow(); |
+ status_ = CompileJobStatus::kFailed; |
+ return false; |
+ } |
+ |
+ zone_.reset(); |
+ parse_info_.reset(); |
+ compile_info_.reset(); |
+ compile_job_.reset(); |
+ handles_from_parsing_.reset(); |
+ handles_from_analysing_.reset(); |
+ |
+ status_ = CompileJobStatus::kDone; |
+ return true; |
+} |
+ |
void CompilerDispatcherJob::ResetOnMainThread() { |
DCHECK(ThreadId::Current().Equals(isolate_->thread_id())); |
@@ -172,6 +246,9 @@ void CompilerDispatcherJob::ResetOnMainThread() { |
parse_info_.reset(); |
zone_.reset(); |
handles_from_parsing_.reset(); |
+ compile_info_.reset(); |
+ compile_job_.reset(); |
+ handles_from_analysing_.reset(); |
if (!source_.is_null()) { |
i::GlobalHandles::Destroy(Handle<Object>::cast(source_).location()); |