[Compiler] Use CompilationCache for StreamedScript compilation.
Previously GetSharedFunctionInfoForStreamedScript didn't either check the compilation cache or put the result of compilation into the compilation cache. This would mean future compiles would need to re-parse / compile the same script even if the isolate had already seen it. This CL fixes this. BUG=v8:5203 Change-Id: I421627b80848feb9884e2440c4ee66556e05b3c9 Reviewed-on: https://chromium-review.googlesource.com/924285 Commit-Queue: Ross McIlroy <rmcilroy@chromium.org> Reviewed-by: Mythri Alle <mythria@chromium.org> Cr-Commit-Position: refs/heads/master@{#51469}
This commit is contained in:
parent
50a6e301a2
commit
eac4b59fd9
@ -1754,42 +1754,62 @@ Compiler::GetSharedFunctionInfoForStreamedScript(
|
||||
ParseInfo* parse_info = streaming_data->info.get();
|
||||
parse_info->UpdateBackgroundParseStatisticsOnMainThread(isolate);
|
||||
|
||||
Handle<Script> script = NewScript(isolate, source, script_details,
|
||||
origin_options, NOT_NATIVES_CODE);
|
||||
parse_info->set_script(script);
|
||||
streaming_data->parser->UpdateStatistics(isolate, script);
|
||||
streaming_data->parser->HandleSourceURLComments(isolate, script);
|
||||
|
||||
if (parse_info->literal() == nullptr) {
|
||||
// Parsing has failed - report error messages.
|
||||
parse_info->pending_error_handler()->ReportErrors(
|
||||
isolate, script, parse_info->ast_value_factory());
|
||||
streaming_data->Release();
|
||||
return MaybeHandle<SharedFunctionInfo>();
|
||||
// Check if compile cache already holds the SFI, if so no need to finalize
|
||||
// the code compiled on the background thread.
|
||||
CompilationCache* compilation_cache = isolate->compilation_cache();
|
||||
MaybeHandle<SharedFunctionInfo> maybe_result =
|
||||
compilation_cache->LookupScript(
|
||||
source, script_details.name_obj, script_details.line_offset,
|
||||
script_details.column_offset, origin_options,
|
||||
isolate->native_context(), parse_info->language_mode());
|
||||
if (!maybe_result.is_null()) {
|
||||
compile_timer.set_hit_isolate_cache();
|
||||
}
|
||||
|
||||
// Parsing has succeeded - finalize compilation.
|
||||
MaybeHandle<SharedFunctionInfo> result;
|
||||
if (i::FLAG_background_compile) {
|
||||
// Finalize background compilation.
|
||||
if (streaming_data->outer_function_job) {
|
||||
result = FinalizeTopLevel(parse_info, isolate,
|
||||
streaming_data->outer_function_job.get(),
|
||||
&streaming_data->inner_function_jobs);
|
||||
} else {
|
||||
// Compilation failed on background thread - throw an exception.
|
||||
if (!isolate->has_pending_exception()) isolate->StackOverflow();
|
||||
if (maybe_result.is_null()) {
|
||||
// No cache entry found, finalize compilation of the script and add it to
|
||||
// the isolate cache.
|
||||
Handle<Script> script = NewScript(isolate, source, script_details,
|
||||
origin_options, NOT_NATIVES_CODE);
|
||||
parse_info->set_script(script);
|
||||
streaming_data->parser->UpdateStatistics(isolate, script);
|
||||
streaming_data->parser->HandleSourceURLComments(isolate, script);
|
||||
|
||||
if (parse_info->literal() == nullptr) {
|
||||
// Parsing has failed - report error messages.
|
||||
parse_info->pending_error_handler()->ReportErrors(
|
||||
isolate, script, parse_info->ast_value_factory());
|
||||
streaming_data->Release();
|
||||
return MaybeHandle<SharedFunctionInfo>();
|
||||
}
|
||||
|
||||
// Parsing has succeeded - finalize compilation.
|
||||
if (i::FLAG_background_compile) {
|
||||
// Finalize background compilation.
|
||||
if (streaming_data->outer_function_job) {
|
||||
maybe_result = FinalizeTopLevel(
|
||||
parse_info, isolate, streaming_data->outer_function_job.get(),
|
||||
&streaming_data->inner_function_jobs);
|
||||
} else {
|
||||
// Compilation failed on background thread - throw an exception.
|
||||
if (!isolate->has_pending_exception()) isolate->StackOverflow();
|
||||
}
|
||||
} else {
|
||||
// Compilation on main thread.
|
||||
maybe_result = CompileToplevel(parse_info, isolate);
|
||||
}
|
||||
|
||||
// Add compiled code to the isolate cache.
|
||||
Handle<SharedFunctionInfo> result;
|
||||
if (!maybe_result.ToHandle(&result)) {
|
||||
isolate->debug()->OnAfterCompile(script);
|
||||
compilation_cache->PutScript(source, isolate->native_context(),
|
||||
parse_info->language_mode(), result);
|
||||
}
|
||||
} else {
|
||||
// Compilation on main thread.
|
||||
result = CompileToplevel(parse_info, isolate);
|
||||
}
|
||||
|
||||
if (!result.is_null()) {
|
||||
isolate->debug()->OnAfterCompile(script);
|
||||
}
|
||||
streaming_data->Release();
|
||||
return result;
|
||||
return maybe_result;
|
||||
}
|
||||
|
||||
Handle<SharedFunctionInfo> Compiler::GetSharedFunctionInfo(
|
||||
|
Loading…
Reference in New Issue
Block a user