| Index: src/compiler.cc
|
| diff --git a/src/compiler.cc b/src/compiler.cc
|
| index 5d0b22fd0c7d12433fe7d1e6d2e5ab84e9ff7752..f56519c631d36dea79cf4283a5e444ae52d481f1 100644
|
| --- a/src/compiler.cc
|
| +++ b/src/compiler.cc
|
| @@ -346,7 +346,8 @@ bool ShouldUseIgnition(CompilationInfo* info) {
|
| return info->shared_info()->PassesFilter(FLAG_ignition_filter);
|
| }
|
|
|
| -CompilationJob* GetUnoptimizedCompilationJob(CompilationInfo* info) {
|
| +std::vector<std::unique_ptr<CompilationJob>> GetUnoptimizedCompilationJob(
|
| + CompilationInfo* info) {
|
| // Function should have been parsed and analyzed before creating a compilation
|
| // job.
|
| DCHECK_NOT_NULL(info->literal());
|
| @@ -356,7 +357,11 @@ CompilationJob* GetUnoptimizedCompilationJob(CompilationInfo* info) {
|
| if (ShouldUseIgnition(info)) {
|
| return interpreter::Interpreter::NewCompilationJob(info);
|
| } else {
|
| - return FullCodeGenerator::NewCompilationJob(info);
|
| + std::unique_ptr<CompilationJob> job(
|
| + FullCodeGenerator::NewCompilationJob(info));
|
| + std::vector<std::unique_ptr<CompilationJob>> result;
|
| + result.push_back(std::move(job));
|
| + return result;
|
| }
|
| }
|
|
|
| @@ -373,11 +378,15 @@ bool GenerateUnoptimizedCode(CompilationInfo* info) {
|
| }
|
| }
|
|
|
| - std::unique_ptr<CompilationJob> job(GetUnoptimizedCompilationJob(info));
|
| - if (job->PrepareJob() != CompilationJob::SUCCEEDED) return false;
|
| - if (job->ExecuteJob() != CompilationJob::SUCCEEDED) return false;
|
| - if (job->FinalizeJob() != CompilationJob::SUCCEEDED) return false;
|
| - job->RecordUnoptimizedCompilationStats();
|
| + std::vector<std::unique_ptr<CompilationJob>> jobs(
|
| + GetUnoptimizedCompilationJob(info));
|
| + for (auto& job : jobs) {
|
| + if (job->PrepareJob() != CompilationJob::SUCCEEDED) return false;
|
| + if (job->ExecuteJob() != CompilationJob::SUCCEEDED) return false;
|
| + if (job->FinalizeJob() != CompilationJob::SUCCEEDED) return false;
|
| + job->RecordUnoptimizedCompilationStats();
|
| + job.reset();
|
| + }
|
| return true;
|
| }
|
|
|
| @@ -1715,10 +1724,9 @@ Handle<SharedFunctionInfo> Compiler::GetSharedFunctionInfoForStreamedScript(
|
| return result;
|
| }
|
|
|
| -
|
| Handle<SharedFunctionInfo> Compiler::GetSharedFunctionInfo(
|
| FunctionLiteral* literal, Handle<Script> script,
|
| - CompilationInfo* outer_info) {
|
| + CompilationInfo* outer_info, ShouldCompile should_compile) {
|
| // Precondition: code has been parsed and scopes have been analyzed.
|
| Isolate* isolate = outer_info->isolate();
|
| MaybeHandle<SharedFunctionInfo> maybe_existing;
|
| @@ -1746,6 +1754,8 @@ Handle<SharedFunctionInfo> Compiler::GetSharedFunctionInfo(
|
| if (!outer_info->is_debug() || existing->HasDebugCode()) {
|
| return existing;
|
| }
|
| + } else if (should_compile == ShouldCompile::kNever) {
|
| + return existing;
|
| }
|
| }
|
|
|
| @@ -1775,7 +1785,8 @@ Handle<SharedFunctionInfo> Compiler::GetSharedFunctionInfo(
|
| RuntimeCallTimerScope runtimeTimer(isolate, &RuntimeCallStats::CompileCode);
|
| TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8.compile"), "V8.CompileCode");
|
|
|
| - if (!literal->ShouldEagerCompile()) {
|
| + if (!literal->ShouldEagerCompile() ||
|
| + should_compile == ShouldCompile::kNever) {
|
| info.SetCode(isolate->builtins()->CompileLazy());
|
| Scope* outer_scope = literal->scope()->GetOuterScopeWithContext();
|
| if (outer_scope) {
|
| @@ -1843,14 +1854,18 @@ MaybeHandle<Code> Compiler::GetOptimizedCodeForOSR(Handle<JSFunction> function,
|
| return GetOptimizedCode(function, NOT_CONCURRENT, osr_ast_id, osr_frame);
|
| }
|
|
|
| -CompilationJob* Compiler::PrepareUnoptimizedCompilationJob(
|
| - CompilationInfo* info) {
|
| +std::vector<std::unique_ptr<CompilationJob>>
|
| +Compiler::PrepareUnoptimizedCompilationJob(CompilationInfo* info) {
|
| VMState<COMPILER> state(info->isolate());
|
| - std::unique_ptr<CompilationJob> job(GetUnoptimizedCompilationJob(info));
|
| - if (job->PrepareJob() != CompilationJob::SUCCEEDED) {
|
| - return nullptr;
|
| + std::vector<std::unique_ptr<CompilationJob>> jobs(
|
| + GetUnoptimizedCompilationJob(info));
|
| + for (auto& job : jobs) {
|
| + if (job->PrepareJob() != CompilationJob::SUCCEEDED) {
|
| + std::vector<std::unique_ptr<CompilationJob>> result;
|
| + return result;
|
| + }
|
| }
|
| - return job.release();
|
| + return jobs;
|
| }
|
|
|
| bool Compiler::FinalizeCompilationJob(CompilationJob* raw_job) {
|
|
|