Index: src/hydrogen.cc |
diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
index 85fb18765b1e275281f7229a532fc21a9e775099..c4ac6c13d606e3946155c1c0c0e1320ebbff0f69 100644 |
--- a/src/hydrogen.cc |
+++ b/src/hydrogen.cc |
@@ -4195,14 +4195,6 @@ bool HGraphBuilder::TryInline(Call* expr) { |
return false; |
} |
- // Check if we can handle all declarations in the inlined functions. |
- VisitDeclarations(target_info.scope()->declarations()); |
- if (HasStackOverflow()) { |
- TraceInline(target, caller, "target has non-trivial declaration"); |
- ClearStackOverflow(); |
- return false; |
- } |
- |
// Don't inline functions that uses the arguments object or that |
// have a mismatching number of parameters. |
int arity = expr->arguments()->length(); |
@@ -4212,6 +4204,15 @@ bool HGraphBuilder::TryInline(Call* expr) { |
return false; |
} |
+ // All declarations must be inlineable. |
+ ZoneList<Declaration*>* decls = target_info.scope()->declarations(); |
+ int decl_count = decls->length(); |
+ for (int i = 0; i < decl_count; ++i) { |
+ if (!decls->at(i)->IsInlineable()) { |
+ TraceInline(target, caller, "target has non-trivial declaration"); |
+ return false; |
+ } |
+ } |
// All statements in the body must be inlineable. |
for (int i = 0, count = function->body()->length(); i < count; ++i) { |
if (!function->body()->at(i)->IsInlineable()) { |
@@ -4237,6 +4238,9 @@ bool HGraphBuilder::TryInline(Call* expr) { |
} |
// ---------------------------------------------------------------- |
+ // After this point, we've made a decision to inline this function (so |
+ // TryInline should always return true). |
+ |
// Save the pending call context and type feedback oracle. Set up new ones |
// for the inlined function. |
ASSERT(target_shared->has_deoptimization_support()); |
@@ -4254,12 +4258,12 @@ bool HGraphBuilder::TryInline(Call* expr) { |
call_kind); |
HBasicBlock* body_entry = CreateBasicBlock(inner_env); |
current_block()->Goto(body_entry); |
- |
body_entry->SetJoinId(expr->ReturnId()); |
set_current_block(body_entry); |
AddInstruction(new(zone()) HEnterInlined(target, |
function, |
call_kind)); |
+ VisitDeclarations(target_info.scope()->declarations()); |
VisitStatements(function->body()); |
if (HasStackOverflow()) { |
// Bail out if the inline function did, as we cannot residualize a call |
@@ -5372,15 +5376,9 @@ void HGraphBuilder::VisitThisFunction(ThisFunction* expr) { |
void HGraphBuilder::VisitDeclaration(Declaration* decl) { |
- // We allow only declarations that do not require code generation. |
- // The following all require code generation: global variables, |
- // functions, and variables with slot type LOOKUP |
+ // We support only declarations that do not require code generation. |
Variable* var = decl->proxy()->var(); |
- Slot* slot = var->AsSlot(); |
- if (var->is_global() || |
- !var->IsStackAllocated() || |
- (slot != NULL && slot->type() == Slot::LOOKUP) || |
- decl->fun() != NULL) { |
+ if (!var->IsStackAllocated() || decl->fun() != NULL) { |
return Bailout("unsupported declaration"); |
} |