diff -r 7fd047780d47 -r a326d528f3e1 hotspot/src/share/vm/runtime/sharedRuntime.cpp --- a/hotspot/src/share/vm/runtime/sharedRuntime.cpp Fri Sep 14 22:00:41 2012 -0700 +++ b/hotspot/src/share/vm/runtime/sharedRuntime.cpp Mon Sep 17 12:57:58 2012 -0700 @@ -1618,6 +1618,31 @@ return callee_method; } +#ifdef ASSERT +void SharedRuntime::check_member_name_argument_is_last_argument(methodHandle method, + const BasicType* sig_bt, + const VMRegPair* regs) { + ResourceMark rm; + const int total_args_passed = method->size_of_parameters(); + const VMRegPair* regs_with_member_name = regs; + VMRegPair* regs_without_member_name = NEW_RESOURCE_ARRAY(VMRegPair, total_args_passed - 1); + + const int member_arg_pos = total_args_passed - 1; + assert(member_arg_pos >= 0 && member_arg_pos < total_args_passed, "oob"); + assert(sig_bt[member_arg_pos] == T_OBJECT, "dispatch argument must be an object"); + + const bool is_outgoing = method->is_method_handle_intrinsic(); + int comp_args_on_stack = java_calling_convention(sig_bt, regs_without_member_name, total_args_passed - 1, is_outgoing); + + for (int i = 0; i < member_arg_pos; i++) { + VMReg a = regs_with_member_name[i].first(); + VMReg b = regs_without_member_name[i].first(); + assert(a->value() == b->value(), err_msg_res("register allocation mismatch: a=%d, b=%d", a->value(), b->value())); + } + assert(regs_with_member_name[member_arg_pos].first()->is_valid(), "bad member arg"); +} +#endif + // --------------------------------------------------------------------------- // We are calling the interpreter via a c2i. Normally this would mean that // we were called by a compiled method. However we could have lost a race @@ -2546,10 +2571,10 @@ MacroAssembler _masm(&buffer); // Fill in the signature array, for the calling-convention call. - int total_args_passed = method->size_of_parameters(); - - BasicType* sig_bt = NEW_RESOURCE_ARRAY(BasicType,total_args_passed); - VMRegPair* regs = NEW_RESOURCE_ARRAY(VMRegPair,total_args_passed); + const int total_args_passed = method->size_of_parameters(); + + BasicType* sig_bt = NEW_RESOURCE_ARRAY(BasicType, total_args_passed); + VMRegPair* regs = NEW_RESOURCE_ARRAY(VMRegPair, total_args_passed); int i=0; if( !method->is_static() ) // Pass in receiver first sig_bt[i++] = T_OBJECT; @@ -2559,7 +2584,7 @@ if( ss.type() == T_LONG || ss.type() == T_DOUBLE ) sig_bt[i++] = T_VOID; // Longs & doubles take 2 Java slots } - assert( i==total_args_passed, "" ); + assert(i == total_args_passed, ""); BasicType ret_type = ss.type(); // Now get the compiled-Java layout as input (or output) arguments. @@ -2572,9 +2597,8 @@ nm = SharedRuntime::generate_native_wrapper(&_masm, method, compile_id, - total_args_passed, - comp_args_on_stack, - sig_bt,regs, + sig_bt, + regs, ret_type); } }