Index: runtime/vm/flow_graph_inliner.cc |
=================================================================== |
--- runtime/vm/flow_graph_inliner.cc (revision 36432) |
+++ runtime/vm/flow_graph_inliner.cc (working copy) |
@@ -817,7 +817,17 @@ |
private: |
friend class PolymorphicInliner; |
+ |
+ static bool Contains(const GrowableArray<intptr_t>& a, intptr_t deopt_id) { |
+ for (intptr_t i = 0; i < a.length(); i++) { |
+ if (a[i] == deopt_id) return true; |
+ } |
+ return false; |
+ } |
+ |
void PrintInlinedInfoFor(const Function& caller, intptr_t depth) { |
+ // Prevent duplicate printing as inlined_info aggregates all inlinining. |
+ GrowableArray<intptr_t> call_instructions_printed; |
// Print those that were inlined. |
for (intptr_t i = 0; i < inlined_info_.length(); i++) { |
const InlinedInfo& info = inlined_info_[i]; |
@@ -825,7 +835,8 @@ |
continue; |
} |
if ((info.inlined_depth == depth) && |
- (info.caller->raw() == caller.raw())) { |
+ (info.caller->raw() == caller.raw()) && |
+ !Contains(call_instructions_printed, info.call_instr->GetDeoptId())) { |
for (int t = 0; t < depth; t++) { |
OS::Print(" "); |
} |
@@ -833,8 +844,10 @@ |
info.call_instr->GetDeoptId(), |
info.inlined->ToQualifiedCString()); |
PrintInlinedInfoFor(*info.inlined, depth + 1); |
+ call_instructions_printed.Add(info.call_instr->GetDeoptId()); |
} |
} |
+ call_instructions_printed.Clear(); |
// Print those that were not inlined. |
for (intptr_t i = 0; i < inlined_info_.length(); i++) { |
const InlinedInfo& info = inlined_info_[i]; |
@@ -842,7 +855,8 @@ |
continue; |
} |
if ((info.inlined_depth == depth) && |
- (info.caller->raw() == caller.raw())) { |
+ (info.caller->raw() == caller.raw()) && |
+ !Contains(call_instructions_printed, info.call_instr->GetDeoptId())) { |
for (int t = 0; t < depth; t++) { |
OS::Print(" "); |
} |
@@ -850,6 +864,7 @@ |
info.call_instr->GetDeoptId(), |
info.inlined->ToQualifiedCString(), |
info.bailout_reason); |
+ call_instructions_printed.Add(info.call_instr->GetDeoptId()); |
} |
} |
} |