Index: src/hydrogen.cc |
diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
index f7a6ce91d0a8d4d9a6edaedc470760aefdf4c764..77f56628042271c172e36445e65bd0e387a97786 100644 |
--- a/src/hydrogen.cc |
+++ b/src/hydrogen.cc |
@@ -521,6 +521,22 @@ HConstant* HGraph::GetConstantFalse() { |
return GetConstant(&constant_false_, isolate()->heap()->false_value()); |
} |
+HGraphBuilder::HGraphBuilder(CompilationInfo* info, |
+ TypeFeedbackOracle* oracle) |
+ : function_state_(NULL), |
+ initial_function_state_(this, info, oracle), |
+ ast_context_(NULL), |
+ break_scope_(NULL), |
+ graph_(NULL), |
+ current_block_(NULL), |
+ inlined_count_(0), |
+ zone_(info->isolate()->zone()), |
+ inline_bailout_(false) { |
+ // This is not initialized in the initializer list because the |
+ // constructor for the initial state relies on function_state_ == NULL |
+ // to know it's the initial state. |
+ function_state_= &initial_function_state_; |
+} |
HBasicBlock* HGraphBuilder::CreateJoin(HBasicBlock* first, |
HBasicBlock* second, |
@@ -4046,10 +4062,11 @@ bool HGraphBuilder::TryInline(Call* expr) { |
// Precondition: call is monomorphic and we have found a target with the |
// appropriate arity. |
Handle<JSFunction> target = expr->target(); |
+ Handle<SharedFunctionInfo> target_shared(target->shared()); |
// Do a quick check on source code length to avoid parsing large |
// inlining candidates. |
- if (FLAG_limit_inlining && target->shared()->SourceSize() > kMaxSourceSize) { |
+ if (FLAG_limit_inlining && target_shared->SourceSize() > kMaxSourceSize) { |
TraceInline(target, "target text too big"); |
return false; |
} |
@@ -4082,7 +4099,7 @@ bool HGraphBuilder::TryInline(Call* expr) { |
} |
// Don't inline recursive functions. |
- if (target->shared() == outer_info->closure()->shared()) { |
+ if (*target_shared == outer_info->closure()->shared()) { |
TraceInline(target, "target is recursive"); |
return false; |
} |
@@ -4102,7 +4119,7 @@ bool HGraphBuilder::TryInline(Call* expr) { |
if (target_info.isolate()->has_pending_exception()) { |
// Parse or scope error, never optimize this function. |
SetStackOverflow(); |
- target->shared()->set_optimization_disabled(true); |
+ target_shared->DisableOptimization(*target); |
} |
TraceInline(target, "parse failure"); |
return false; |
@@ -4131,7 +4148,6 @@ bool HGraphBuilder::TryInline(Call* expr) { |
// Don't inline functions that uses the arguments object or that |
// have a mismatching number of parameters. |
- Handle<SharedFunctionInfo> target_shared(target->shared()); |
int arity = expr->arguments()->length(); |
if (function->scope()->arguments() != NULL || |
arity != target_shared->formal_parameter_count()) { |
@@ -4189,6 +4205,8 @@ bool HGraphBuilder::TryInline(Call* expr) { |
// Bail out if the inline function did, as we cannot residualize a call |
// instead. |
TraceInline(target, "inline graph construction failed"); |
+ target_shared->DisableOptimization(*target); |
+ inline_bailout_ = true; |
return true; |
} |