src/share/vm/interpreter/interpreterRuntime.cpp

changeset 7181
134f18d0174b
parent 6680
78bbf4d43a14
child 7419
d3f3f7677537
     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

mercurial