Index: runtime/vm/flow_graph_compiler.cc |
=================================================================== |
--- runtime/vm/flow_graph_compiler.cc (revision 37100) |
+++ runtime/vm/flow_graph_compiler.cc (working copy) |
@@ -888,21 +888,32 @@ |
const Function& function, |
intptr_t argument_count, |
const Array& argument_names, |
- LocationSummary* locs) { |
- const Array& arguments_descriptor = |
- Array::ZoneHandle(ArgumentsDescriptor::New(argument_count, |
- argument_names)); |
+ LocationSummary* locs, |
+ const ICData& ic_data) { |
+ const Array& arguments_descriptor = Array::ZoneHandle( |
+ ic_data.IsNull() ? ArgumentsDescriptor::New(argument_count, |
+ argument_names) |
+ : ic_data.arguments_descriptor()); |
// Proper reporting of Javascript incompatibilities requires icdata and |
// may therefore prevent the optimization of some static calls. |
if (is_optimizing() && |
!(FLAG_warn_on_javascript_compatibility && |
(MethodRecognizer::RecognizeKind(function) == |
MethodRecognizer::kObjectIdentical))) { |
- EmitOptimizedStaticCall(function, arguments_descriptor, argument_count, |
- deopt_id, token_pos, locs); |
+ EmitOptimizedStaticCall(function, arguments_descriptor, |
+ argument_count, deopt_id, token_pos, locs); |
} else { |
- EmitUnoptimizedStaticCall(function, arguments_descriptor, argument_count, |
- deopt_id, token_pos, locs); |
+ ICData& call_ic_data = ICData::ZoneHandle(ic_data.raw()); |
+ if (call_ic_data.IsNull()) { |
+ call_ic_data = ICData::New(parsed_function().function(), // Caller fun. |
+ String::Handle(function.name()), |
+ arguments_descriptor, |
+ deopt_id, |
+ 0); // No arguments checked. |
+ call_ic_data.AddTarget(function); |
+ } |
+ EmitUnoptimizedStaticCall(argument_count, deopt_id, token_pos, locs, |
+ call_ic_data); |
} |
} |