Chromium Code Reviews| Index: runtime/vm/compiler.cc |
| =================================================================== |
| --- runtime/vm/compiler.cc (revision 35921) |
| +++ runtime/vm/compiler.cc (working copy) |
| @@ -59,6 +59,8 @@ |
| "Enable compiler verification assertions"); |
| DECLARE_FLAG(bool, trace_failed_optimization_attempts); |
| +DECLARE_FLAG(bool, warn_on_javascript_incompatibility); |
| +DECLARE_FLAG(bool, warning_as_error); |
| // Compile a function. Should call only if the function has not been compiled. |
| // Arg0: function object. |
| @@ -596,10 +598,11 @@ |
| is_compiled = true; |
| done = true; |
| } else { |
| - // We bailed out. |
| + // We bailed out or we encountered an error. |
| + const Error& error = Error::Handle( |
| + isolate->object_store()->sticky_error()); |
| - if (isolate->object_store()->sticky_error() == |
| - Object::branch_offset_error().raw()) { |
| + if (error.raw() == Object::branch_offset_error().raw()) { |
| // Compilation failed due to an out of range branch offset in the |
| // assembler. We try again (done = false) with far branches enabled. |
| done = false; |
| @@ -610,15 +613,19 @@ |
| // try again (done = true), and indicate that we did not finish |
| // compiling (is_compiled = false). |
| if (FLAG_trace_bailout) { |
| - const Error& bailout_error = Error::Handle( |
| - isolate->object_store()->sticky_error()); |
| - OS::Print("%s\n", bailout_error.ToErrorCString()); |
| + OS::Print("%s\n", error.ToErrorCString()); |
| } |
| done = true; |
| - ASSERT(optimized); |
| + ASSERT(optimized || |
| + (FLAG_warn_on_javascript_incompatibility && |
| + FLAG_warning_as_error)); |
| } |
| - isolate->object_store()->clear_sticky_error(); |
| + // Clear the error if it was not a real error, but just a bailout. |
| + if (error.IsLanguageError() && |
| + (LanguageError::Cast(error).kind() == LanguageError::kBailout)) { |
| + isolate->object_store()->clear_sticky_error(); |
| + } |
| is_compiled = false; |
| } |
| // Reset global isolate state. |
| @@ -791,19 +798,29 @@ |
| const bool success = |
| CompileParsedFunctionHelper(parsed_function, optimized, osr_id); |
| - if (optimized && !success) { |
| - // Optimizer bailed out. Disable optimizations and to never try again. |
| - if (FLAG_trace_compiler) { |
| - OS::Print("--> disabling optimizations for '%s'\n", |
| - function.ToFullyQualifiedCString()); |
| - } else if (FLAG_trace_failed_optimization_attempts) { |
| - OS::Print("Cannot optimize: %s\n", function.ToFullyQualifiedCString()); |
| + if (!success) { |
| + if (optimized) { |
| + // Optimizer bailed out. Disable optimizations and to never try again. |
| + if (FLAG_trace_compiler) { |
| + OS::Print("--> disabling optimizations for '%s'\n", |
| + function.ToFullyQualifiedCString()); |
| + } else if (FLAG_trace_failed_optimization_attempts) { |
| + OS::Print("Cannot optimize: %s\n", |
| + function.ToFullyQualifiedCString()); |
| + } |
| + function.SetIsOptimizable(false); |
| + return Error::null(); |
| } |
| - function.SetIsOptimizable(false); |
| - return Error::null(); |
| + // So far, the only possible real error is a JS warning reported as error. |
| + ASSERT(FLAG_warn_on_javascript_incompatibility && FLAG_warning_as_error); |
| + Error& error = Error::Handle(); |
| + // We got an error during compilation. |
| + error = isolate->object_store()->sticky_error(); |
| + ASSERT(!error.IsNull()); |
| + isolate->object_store()->clear_sticky_error(); |
| + return error.raw(); |
|
srdjan
2014/05/08 18:11:05
Maybe add per_compile_timer.Stop() before return.
regis
2014/05/09 21:03:42
As discussed, the timer will stop when leaving the
|
| } |
| - ASSERT(success); |
| per_compile_timer.Stop(); |
| if (FLAG_trace_compiler) { |