Index: src/compiler.cc |
diff --git a/src/compiler.cc b/src/compiler.cc |
index c57510d19d5b6e690d10f545a6d8ce83816802bb..51c21491819a296a34b7318ea24f277bc8fdd53b 100755 |
--- a/src/compiler.cc |
+++ b/src/compiler.cc |
@@ -94,6 +94,7 @@ CompilationInfo::CompilationInfo(Handle<JSFunction> closure) |
} |
+// Disable optimization for the rest of the compilation pipeline. |
void CompilationInfo::DisableOptimization() { |
bool is_optimizable_closure = |
FLAG_optimize_closures && |
@@ -105,6 +106,14 @@ void CompilationInfo::DisableOptimization() { |
} |
+void CompilationInfo::AbortOptimization() { |
+ Handle<Code> code(shared_info()->code()); |
+ SetCode(code); |
+ Isolate* isolate = code->GetIsolate(); |
+ isolate->compilation_cache()->MarkForLazyOptimizing(closure()); |
+} |
+ |
+ |
// Determine whether to use the full compiler for all code. If the flag |
// --always-full-compiler is specified this is the case. For the virtual frame |
// based compiler the full compiler is also used if a debugger is connected, as |
@@ -156,31 +165,6 @@ static void FinishOptimization(Handle<JSFunction> function, int64_t start) { |
} |
-static void AbortAndDisable(CompilationInfo* info) { |
- // Disable optimization for the shared function info and mark the |
- // code as non-optimizable. The marker on the shared function info |
- // is there because we flush non-optimized code thereby loosing the |
- // non-optimizable information for the code. When the code is |
- // regenerated and set on the shared function info it is marked as |
- // non-optimizable if optimization is disabled for the shared |
- // function info. |
- Handle<SharedFunctionInfo> shared = info->shared_info(); |
- shared->set_optimization_disabled(true); |
- Handle<Code> code = Handle<Code>(shared->code()); |
- ASSERT(code->kind() == Code::FUNCTION); |
- code->set_optimizable(false); |
- info->SetCode(code); |
- Isolate* isolate = code->GetIsolate(); |
- isolate->compilation_cache()->MarkForLazyOptimizing(info->closure()); |
- if (FLAG_trace_opt) { |
- PrintF("[disabled optimization for: "); |
- info->closure()->PrintName(); |
- PrintF(" / %" V8PRIxPTR "]\n", |
- reinterpret_cast<intptr_t>(*info->closure())); |
- } |
-} |
- |
- |
static bool MakeCrankshaftCode(CompilationInfo* info) { |
// Test if we can optimize this function when asked to. We can only |
// do this after the scopes are computed. |
@@ -214,7 +198,9 @@ static bool MakeCrankshaftCode(CompilationInfo* info) { |
const int kMaxOptCount = |
FLAG_deopt_every_n_times == 0 ? Compiler::kDefaultMaxOptCount : 1000; |
if (info->shared_info()->opt_count() > kMaxOptCount) { |
- AbortAndDisable(info); |
+ info->AbortOptimization(); |
+ Handle<JSFunction> closure = info->closure(); |
+ info->shared_info()->DisableOptimization(*closure); |
// True indicates the compilation pipeline is still going, not |
// necessarily that we optimized the code. |
return true; |
@@ -231,7 +217,9 @@ static bool MakeCrankshaftCode(CompilationInfo* info) { |
Scope* scope = info->scope(); |
if ((scope->num_parameters() + 1) > limit || |
scope->num_stack_slots() > limit) { |
- AbortAndDisable(info); |
+ info->AbortOptimization(); |
+ Handle<JSFunction> closure = info->closure(); |
+ info->shared_info()->DisableOptimization(*closure); |
// True indicates the compilation pipeline is still going, not |
// necessarily that we optimized the code. |
return true; |
@@ -304,9 +292,14 @@ static bool MakeCrankshaftCode(CompilationInfo* info) { |
} |
} |
- // Compilation with the Hydrogen compiler failed. Keep using the |
- // shared code but mark it as unoptimizable. |
- AbortAndDisable(info); |
+ // Keep using the shared code. |
+ info->AbortOptimization(); |
+ if (!builder.inline_bailout()) { |
+ // Mark the shared code as unoptimizable unless it was an inlined |
+ // function that bailed out. |
+ Handle<JSFunction> closure = info->closure(); |
+ info->shared_info()->DisableOptimization(*closure); |
+ } |
// True indicates the compilation pipeline is still going, not necessarily |
// that we optimized the code. |
return true; |