--- 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);
}
}