Thu, 29 May 2014 09:41:07 +0000
8034935: JSR 292 support for PopFrame has a fragile coupling with DirectMethodHandle
Reviewed-by: twisti, jrose, sspitsyn
src/share/vm/interpreter/interpreterRuntime.cpp | file | annotate | diff | comparison | revisions |
1.1 --- a/src/share/vm/interpreter/interpreterRuntime.cpp Tue Mar 04 02:23:16 2014 -0800 1.2 +++ b/src/share/vm/interpreter/interpreterRuntime.cpp Thu May 29 09:41:07 2014 +0000 1.3 @@ -1269,8 +1269,10 @@ 1.4 // This is a support of the JVMTI PopFrame interface. 1.5 // Make sure it is an invokestatic of a polymorphic intrinsic that has a member_name argument 1.6 // and return it as a vm_result so that it can be reloaded in the list of invokestatic parameters. 1.7 -// The dmh argument is a reference to a DirectMethoHandle that has a member name field. 1.8 -IRT_ENTRY(void, InterpreterRuntime::member_name_arg_or_null(JavaThread* thread, address dmh, 1.9 +// The member_name argument is a saved reference (in local#0) to the member_name. 1.10 +// For backward compatibility with some JDK versions (7, 8) it can also be a direct method handle. 1.11 +// FIXME: remove DMH case after j.l.i.InvokerBytecodeGenerator code shape is updated. 1.12 +IRT_ENTRY(void, InterpreterRuntime::member_name_arg_or_null(JavaThread* thread, address member_name, 1.13 Method* method, address bcp)) 1.14 Bytecodes::Code code = Bytecodes::code_at(method, bcp); 1.15 if (code != Bytecodes::_invokestatic) { 1.16 @@ -1282,8 +1284,12 @@ 1.17 Symbol* mname = cpool->name_ref_at(cp_index); 1.18 1.19 if (MethodHandles::has_member_arg(cname, mname)) { 1.20 - oop member_name = java_lang_invoke_DirectMethodHandle::member((oop)dmh); 1.21 - thread->set_vm_result(member_name); 1.22 + oop member_name_oop = (oop) member_name; 1.23 + if (java_lang_invoke_DirectMethodHandle::is_instance(member_name_oop)) { 1.24 + // FIXME: remove after j.l.i.InvokerBytecodeGenerator code shape is updated. 1.25 + member_name_oop = java_lang_invoke_DirectMethodHandle::member(member_name_oop); 1.26 + } 1.27 + thread->set_vm_result(member_name_oop); 1.28 } 1.29 IRT_END 1.30 #endif // INCLUDE_JVMTI