Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(72)

Unified Diff: src/compiler.cc

Issue 2686673002: [Compiler] Avoid blocking on inner function parallel compilation. (Closed)
Patch Set: Fix outer_scope_info handling Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | src/compiler-dispatcher/compiler-dispatcher.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/compiler.cc
diff --git a/src/compiler.cc b/src/compiler.cc
index 7a923ab08cab4a893de6efb0f247e8043344c122..31bc762cd7b5938916708070076c443a2a8ec951 100644
--- a/src/compiler.cc
+++ b/src/compiler.cc
@@ -547,7 +547,8 @@ bool CompileUnoptimizedInnerFunctions(
CompilerDispatcher* dispatcher = isolate->compiler_dispatcher();
if (UseCompilerDispatcher(inner_function_mode, dispatcher, literal->scope(),
shared, is_debug, will_serialize) &&
- dispatcher->EnqueueAndStep(shared, literal, parse_zone,
+ dispatcher->EnqueueAndStep(outer_info->script(), shared, literal,
+ parse_zone,
outer_info->parse_info()->deferred_handles(),
outer_info->deferred_handles())) {
// If we have successfully queued up the function for compilation on the
@@ -629,17 +630,6 @@ bool CompileUnoptimizedCode(CompilationInfo* info,
return false;
}
- // TODO(rmcilroy): Remove this once the enqueued tasks can keep the parsed
- // zone and handles alive and replace with a check in CompileLazy to finish
- // the task itself.
- RuntimeCallTimerScope runtimeTimer(
- isolate, &RuntimeCallStats::CompileWaitForDispatcher);
- if (isolate->compiler_dispatcher()->IsEnabled() &&
- !isolate->compiler_dispatcher()->FinishAllNow()) {
- if (!isolate->has_pending_exception()) isolate->StackOverflow();
- return false;
- }
-
return true;
}
@@ -1258,13 +1248,25 @@ bool Compiler::Compile(Handle<JSFunction> function, ClearExceptionFlag flag) {
Isolate* isolate = function->GetIsolate();
DCHECK(AllowCompilation::IsAllowed(isolate));
- // Start a compilation.
+ CompilerDispatcher* dispatcher = isolate->compiler_dispatcher();
+ Handle<SharedFunctionInfo> shared(function->shared(), isolate);
Handle<Code> code;
- if (!GetLazyCode(function).ToHandle(&code)) {
- if (flag == CLEAR_EXCEPTION) {
- isolate->clear_pending_exception();
+ if (dispatcher->IsEnqueued(shared)) {
+ if (!dispatcher->FinishNow(shared)) {
+ if (flag == CLEAR_EXCEPTION) {
+ isolate->clear_pending_exception();
+ }
+ return false;
+ }
+ code = handle(shared->code(), isolate);
+ } else {
+ // Start a compilation.
+ if (!GetLazyCode(function).ToHandle(&code)) {
+ if (flag == CLEAR_EXCEPTION) {
+ isolate->clear_pending_exception();
+ }
+ return false;
}
- return false;
}
// Install code on closure.
@@ -1387,7 +1389,10 @@ MaybeHandle<JSArray> Compiler::CompileForLiveEdit(Handle<Script> script) {
bool Compiler::EnsureBytecode(CompilationInfo* info) {
if (!info->shared_info()->is_compiled()) {
- if (GetUnoptimizedCode(info, Compiler::NOT_CONCURRENT).is_null()) {
+ CompilerDispatcher* dispatcher = info->isolate()->compiler_dispatcher();
+ if (dispatcher->IsEnqueued(info->shared_info())) {
+ if (!dispatcher->FinishNow(info->shared_info())) return false;
+ } else if (GetUnoptimizedCode(info, Compiler::NOT_CONCURRENT).is_null()) {
return false;
}
}
@@ -1405,6 +1410,12 @@ bool Compiler::EnsureDeoptimizationSupport(CompilationInfo* info) {
DCHECK_NOT_NULL(info->literal());
DCHECK_NOT_NULL(info->scope());
Handle<SharedFunctionInfo> shared = info->shared_info();
+
+ CompilerDispatcher* dispatcher = info->isolate()->compiler_dispatcher();
+ if (dispatcher->IsEnqueued(shared)) {
+ if (!dispatcher->FinishNow(shared)) return false;
+ }
+
if (!shared->has_deoptimization_support()) {
Zone compile_zone(info->isolate()->allocator(), ZONE_NAME);
CompilationInfo unoptimized(&compile_zone, info->parse_info(),
« no previous file with comments | « no previous file | src/compiler-dispatcher/compiler-dispatcher.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698