Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index 9933e9c61497c8d3307ea4643cc96b65bc0eca07..7e1d8b6b5a6d0066276c0870023973ab230c0622 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -9202,12 +9202,27 @@ void JSFunction::MarkForOptimization() { |
} |
-void JSFunction::MarkForConcurrentOptimization() { |
- DCHECK(is_compiled() || GetIsolate()->DebuggerHasBreakPoints()); |
+void JSFunction::AttemptConcurrentOptimization() { |
+ Isolate* isolate = GetIsolate(); |
+ if (!isolate->concurrent_recompilation_enabled() || |
+ isolate->bootstrapper()->IsActive()) { |
+ MarkForOptimization(); |
+ return; |
+ } |
+ if (isolate->concurrent_osr_enabled() && |
+ isolate->optimizing_compiler_thread()->IsQueuedForOSR(this)) { |
+ // Do not attempt regular recompilation if we already queued this for OSR. |
+ // TODO(yangguo): This is necessary so that we don't install optimized |
+ // code on a function that is already optimized, since OSR and regular |
+ // recompilation race. This goes away as soon as OSR becomes one-shot. |
+ return; |
+ } |
+ DCHECK(!IsInOptimizationQueue()); |
+ DCHECK(is_compiled() || isolate->DebuggerHasBreakPoints()); |
DCHECK(!IsOptimized()); |
DCHECK(shared()->allows_lazy_compilation() || code()->optimizable()); |
DCHECK(!shared()->is_generator()); |
- DCHECK(GetIsolate()->concurrent_recompilation_enabled()); |
+ DCHECK(isolate->concurrent_recompilation_enabled()); |
if (FLAG_trace_concurrent_recompilation) { |
PrintF(" ** Marking "); |
ShortPrint(); |