Index: runtime/vm/flow_graph_compiler_mips.cc |
=================================================================== |
--- runtime/vm/flow_graph_compiler_mips.cc (revision 24189) |
+++ runtime/vm/flow_graph_compiler_mips.cc (working copy) |
@@ -1116,7 +1116,8 @@ |
ASSERT(!parsed_function().function().HasOptionalParameters()); |
const bool check_arguments = true; |
#else |
- const bool check_arguments = function.IsClosureFunction(); |
+ const bool check_arguments = |
+ function.IsClosureFunction() || function.IsNoSuchMethodDispatcher(); |
#endif |
if (check_arguments) { |
__ TraceSimMsg("Check argument count"); |
@@ -1131,7 +1132,7 @@ |
ArgumentsDescriptor::positional_count_offset())); |
__ beq(T0, T1, &correct_num_arguments); |
__ Bind(&wrong_num_arguments); |
- if (function.IsClosureFunction()) { |
+ if (function.IsClosureFunction() || function.IsNoSuchMethodDispatcher()) { |
if (StackSize() != 0) { |
// We need to unwind the space we reserved for locals and copied |
// parameters. The NoSuchMethodFunction stub does not expect to see |
@@ -1142,11 +1143,15 @@ |
// dropped the spill slots. |
BitmapBuilder* empty_stack_bitmap = new BitmapBuilder(); |
- // Invoke noSuchMethod function passing "call" as the function name. |
+ // Invoke noSuchMethod function passing the original function name. |
+ // For closure functions, use "call" as the original name. |
+ const String& name = |
+ String::Handle(function.IsClosureFunction() |
+ ? Symbols::Call().raw() |
+ : function.name()); |
const int kNumArgsChecked = 1; |
const ICData& ic_data = ICData::ZoneHandle( |
- ICData::New(function, Symbols::Call(), |
- Isolate::kNoDeoptId, kNumArgsChecked)); |
+ ICData::New(function, name, Isolate::kNoDeoptId, kNumArgsChecked)); |
__ LoadObject(S5, ic_data); |
// FP - 4 : saved PP, object pool pointer of caller. |
// FP + 0 : previous frame pointer. |