[offthread] Resolve parallel tasks in off-thread merge

Parallel tasks have to be resolved to their SharedFunctionInfos on the
main thread, so do so for off-thread finalizations.

Bug: chromium:1011762
Change-Id: I1f0c510630b820cad191db614960ed734218bf0e
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2110018
Commit-Queue: Leszek Swirski <leszeks@chromium.org>
Reviewed-by: Ross McIlroy <rmcilroy@chromium.org>
Cr-Commit-Position: refs/heads/master@{#67362}
This commit is contained in:
Leszek Swirski 2020-04-24 14:39:15 +02:00 committed by Commit Bot
parent 1aa51b498e
commit 2b8cc34b09
2 changed files with 28 additions and 34 deletions

View File

@ -1041,14 +1041,13 @@ bool FailWithPendingExceptionAfterOffThreadFinalization(
return false;
}
void FinalizeScriptCompilation(Isolate* isolate, Handle<Script> script,
ParseInfo* parse_info) {
void FinalizeScriptCompilation(
Isolate* isolate, Handle<Script> script,
UnoptimizedCompileState::ParallelTasks* parallel_tasks) {
script->set_compilation_state(Script::COMPILATION_STATE_COMPILED);
// Register any pending parallel tasks with the associated SFI.
if (parse_info->parallel_tasks()) {
CompilerDispatcher* dispatcher = parse_info->parallel_tasks()->dispatcher();
for (auto& it : *parse_info->parallel_tasks()) {
if (parallel_tasks) {
CompilerDispatcher* dispatcher = parallel_tasks->dispatcher();
for (auto& it : *parallel_tasks) {
FunctionLiteral* literal = it.first;
CompilerDispatcher::JobId job_id = it.second;
MaybeHandle<SharedFunctionInfo> maybe_shared_for_task =
@ -1063,12 +1062,6 @@ void FinalizeScriptCompilation(Isolate* isolate, Handle<Script> script,
}
}
void FinalizeScriptCompilation(OffThreadIsolate* isolate, Handle<Script> script,
ParseInfo* parse_info) {
script->set_compilation_state(Script::COMPILATION_STATE_COMPILED);
DCHECK(!parse_info->parallel_tasks());
}
template <typename LocalIsolate>
MaybeHandle<SharedFunctionInfo> FinalizeTopLevel(
ParseInfo* parse_info, Handle<Script> script, LocalIsolate* isolate,
@ -1089,13 +1082,8 @@ MaybeHandle<SharedFunctionInfo> FinalizeTopLevel(
// Finalize compilation of the unoptimized bytecode or asm-js data.
if (!FinalizeUnoptimizedCode(parse_info, isolate, shared_info,
outer_function_job, inner_function_jobs)) {
FailWithPendingException(isolate, script, parse_info,
Compiler::ClearExceptionFlag::KEEP_EXCEPTION);
return MaybeHandle<SharedFunctionInfo>();
}
FinalizeScriptCompilation(isolate, script, parse_info);
return shared_info;
}
@ -1139,7 +1127,7 @@ MaybeHandle<SharedFunctionInfo> CompileToplevel(
return MaybeHandle<SharedFunctionInfo>();
}
FinalizeScriptCompilation(isolate, script, parse_info);
FinalizeScriptCompilation(isolate, script, parse_info->parallel_tasks());
return shared_info;
}
@ -1357,8 +1345,9 @@ void BackgroundCompileTask::Run() {
Handle<SharedFunctionInfo> result;
if (!maybe_result.ToHandle(&result)) {
compile_state_.pending_error_handler()->PrepareErrorsOffThread(
isolate, script, info_->ast_value_factory());
DCHECK(compile_state_.pending_error_handler()->has_pending_error());
FailWithPendingException(isolate, script, info_.get(),
Compiler::ClearExceptionFlag::KEEP_EXCEPTION);
}
outer_function_sfi_ = isolate->TransferHandle(maybe_result);
@ -2611,7 +2600,8 @@ Compiler::GetSharedFunctionInfoForStreamedScript(
origin_options, NOT_NATIVES_CODE);
if (maybe_result.is_null()) {
// Parsing has failed - report error messages.
// Off-thread parse, compile or finalization has failed - report error
// messages.
FailWithPendingExceptionAfterOffThreadFinalization(
isolate, script, task->pending_error_handler());
} else {
@ -2639,6 +2629,8 @@ Compiler::GetSharedFunctionInfoForStreamedScript(
}
});
}
FinalizeScriptCompilation(isolate, script, task->parallel_tasks());
}
} else {
ParseInfo* parse_info = task->info();
@ -2652,21 +2644,20 @@ Compiler::GetSharedFunctionInfoForStreamedScript(
task->parser()->UpdateStatistics(isolate, script);
task->parser()->HandleSourceURLComments(isolate, script);
if (parse_info->literal() == nullptr || !task->outer_function_job()) {
// Parsing has failed - report error messages.
FailWithPendingException(isolate, script, parse_info,
Compiler::ClearExceptionFlag::KEEP_EXCEPTION);
} else {
// Parsing has succeeded - finalize compilation.
if (parse_info->literal() != nullptr && task->outer_function_job()) {
// Off-thread parse & compile has succeeded - finalize compilation.
maybe_result = FinalizeTopLevel(parse_info, script, isolate,
task->outer_function_job(),
task->inner_function_jobs());
if (maybe_result.is_null()) {
// Finalization failed - throw an exception.
FailWithPendingException(
isolate, script, parse_info,
Compiler::ClearExceptionFlag::KEEP_EXCEPTION);
}
}
if (maybe_result.is_null()) {
// Compilation failed - throw an exception.
FailWithPendingException(isolate, script, parse_info,
Compiler::ClearExceptionFlag::KEEP_EXCEPTION);
} else {
FinalizeScriptCompilation(isolate, script,
parse_info->parallel_tasks());
}
}

View File

@ -394,6 +394,9 @@ class V8_EXPORT_PRIVATE BackgroundCompileTask {
PendingCompilationErrorHandler* pending_error_handler() {
return compile_state_.pending_error_handler();
}
UnoptimizedCompileState::ParallelTasks* parallel_tasks() {
return compile_state_.parallel_tasks();
}
MaybeHandle<SharedFunctionInfo> outer_function_sfi() {
DCHECK_NOT_NULL(off_thread_isolate_);
return outer_function_sfi_.ToHandle();