Mercurial > hg > graal-compiler
diff src/share/vm/ci/ciMethodHandle.cpp @ 6266:1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
6984705: JSR 292 method handle creation should not go through JNI
Summary: remove assembly code for JDK 7 chained method handles
Reviewed-by: jrose, twisti, kvn, mhaupt
Contributed-by: John Rose <john.r.rose@oracle.com>, Christian Thalinger <christian.thalinger@oracle.com>, Michael Haupt <michael.haupt@oracle.com>
author | twisti |
---|---|
date | Tue, 24 Jul 2012 10:51:00 -0700 |
parents | e0658a9b3f87 |
children | da91efe96a93 |
line wrap: on
line diff
--- a/src/share/vm/ci/ciMethodHandle.cpp Mon Jul 23 13:04:59 2012 -0700 +++ b/src/share/vm/ci/ciMethodHandle.cpp Tue Jul 24 10:51:00 2012 -0700 @@ -24,84 +24,18 @@ #include "precompiled.hpp" #include "ci/ciClassList.hpp" -#include "ci/ciInstance.hpp" -#include "ci/ciMethodData.hpp" #include "ci/ciMethodHandle.hpp" #include "ci/ciUtilities.hpp" -#include "prims/methodHandleWalk.hpp" -#include "prims/methodHandles.hpp" - -// ciMethodHandle +#include "classfile/javaClasses.hpp" // ------------------------------------------------------------------ -// ciMethodHandle::get_adapter +// ciMethodHandle::get_vmtarget // -// Return an adapter for this MethodHandle. -ciMethod* ciMethodHandle::get_adapter_impl(bool is_invokedynamic) { +// Return: MH.form -> LF.vmentry -> MN.vmtarget +ciMethod* ciMethodHandle::get_vmtarget() const { VM_ENTRY_MARK; - Handle h(get_oop()); - methodHandle callee(_callee->get_methodOop()); - assert(callee->is_method_handle_invoke(), ""); - oop mt1 = callee->method_handle_type(); - oop mt2 = java_lang_invoke_MethodHandle::type(h()); - if (!java_lang_invoke_MethodType::equals(mt1, mt2)) { - if (PrintMiscellaneous && (Verbose || WizardMode)) { - tty->print_cr("ciMethodHandle::get_adapter: types not equal"); - mt1->print(); mt2->print(); - } - return NULL; - } - // We catch all exceptions here that could happen in the method - // handle compiler and stop the VM. - MethodHandleCompiler mhc(h, callee->name(), callee->signature(), _profile.count(), is_invokedynamic, THREAD); - if (!HAS_PENDING_EXCEPTION) { - methodHandle m = mhc.compile(THREAD); - if (!HAS_PENDING_EXCEPTION) { - return CURRENT_ENV->get_object(m())->as_method(); - } - } - if (PrintMiscellaneous && (Verbose || WizardMode)) { - tty->print("*** ciMethodHandle::get_adapter => "); - PENDING_EXCEPTION->print(); - tty->print("*** get_adapter (%s): ", is_invokedynamic ? "indy" : "mh"); ((ciObject*)this)->print(); - } - CLEAR_PENDING_EXCEPTION; - return NULL; + oop form_oop = java_lang_invoke_MethodHandle::form(get_oop()); + oop vmentry_oop = java_lang_invoke_LambdaForm::vmentry(form_oop); + oop vmtarget_oop = java_lang_invoke_MemberName::vmtarget(vmentry_oop); + return CURRENT_ENV->get_object(vmtarget_oop)->as_method(); } - -// ------------------------------------------------------------------ -// ciMethodHandle::get_adapter -// -// Return an adapter for this MethodHandle. -ciMethod* ciMethodHandle::get_adapter(bool is_invokedynamic) { - ciMethod* result = get_adapter_impl(is_invokedynamic); - if (result) { - // Fake up the MDO maturity. - ciMethodData* mdo = result->method_data(); - if (mdo != NULL && _caller->method_data() != NULL && _caller->method_data()->is_mature()) { - mdo->set_mature(); - } - } - return result; -} - - -#ifdef ASSERT -// ------------------------------------------------------------------ -// ciMethodHandle::print_chain_impl -// -// Implementation of the print method. -void ciMethodHandle::print_chain_impl() { - ASSERT_IN_VM; - MethodHandleChain::print(get_oop()); -} - - -// ------------------------------------------------------------------ -// ciMethodHandle::print_chain -// -// Implementation of the print_chain method. -void ciMethodHandle::print_chain() { - GUARDED_VM_ENTRY(print_chain_impl();); -} -#endif