Index: runtime/vm/flow_graph_compiler_ia32.cc |
=================================================================== |
--- runtime/vm/flow_graph_compiler_ia32.cc (revision 24189) |
+++ runtime/vm/flow_graph_compiler_ia32.cc (working copy) |
@@ -1149,7 +1149,8 @@ |
const bool check_arguments = !flow_graph().IsCompiledForOsr(); |
#else |
const bool check_arguments = |
- function.IsClosureFunction() && !flow_graph().IsCompiledForOsr(); |
+ (function.IsClosureFunction() || function.IsNoSuchMethodDispatcher()) && |
+ !flow_graph().IsCompiledForOsr(); |
#endif |
if (check_arguments) { |
__ Comment("Check argument count"); |
@@ -1164,7 +1165,7 @@ |
__ j(EQUAL, &correct_num_arguments, Assembler::kNearJump); |
__ 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 |
@@ -1175,11 +1176,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(ECX, ic_data); |
// EBP - 4 : PC marker, for easy identification of RawInstruction obj. |
// EBP : points to previous frame pointer. |