Mercurial > hg > graal-compiler
comparison src/cpu/zero/vm/cppInterpreter_zero.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 | 7f410b6ea66c |
children | da91efe96a93 |
comparison
equal
deleted
inserted
replaced
6241:aba91a731143 | 6266:1d7922586cf6 |
---|---|
644 p = *(address*)(p + (*pc)); | 644 p = *(address*)(p + (*pc)); |
645 } | 645 } |
646 oop method_type = (oop) p; | 646 oop method_type = (oop) p; |
647 | 647 |
648 // The MethodHandle is in the slot after the arguments | 648 // The MethodHandle is in the slot after the arguments |
649 oop form = java_lang_invoke_MethodType::form(method_type); | 649 int num_vmslots = argument_slots - 1; |
650 int num_vmslots = java_lang_invoke_MethodTypeForm::vmslots(form); | |
651 assert(argument_slots == num_vmslots + 1, "should be"); | |
652 oop method_handle = VMSLOTS_OBJECT(num_vmslots); | 650 oop method_handle = VMSLOTS_OBJECT(num_vmslots); |
653 | 651 |
654 // InvokeGeneric requires some extra shuffling | 652 // InvokeGeneric requires some extra shuffling |
655 oop mhtype = java_lang_invoke_MethodHandle::type(method_handle); | 653 oop mhtype = java_lang_invoke_MethodHandle::type(method_handle); |
656 bool is_exact = mhtype == method_type; | 654 bool is_exact = mhtype == method_type; |
657 if (!is_exact) { | 655 if (!is_exact) { |
658 if (method->intrinsic_id() == vmIntrinsics::_invokeExact) { | 656 if (true || // FIXME |
657 method->intrinsic_id() == vmIntrinsics::_invokeExact) { | |
659 CALL_VM_NOCHECK_NOFIX( | 658 CALL_VM_NOCHECK_NOFIX( |
660 SharedRuntime::throw_WrongMethodTypeException( | 659 SharedRuntime::throw_WrongMethodTypeException( |
661 thread, method_type, mhtype)); | 660 thread, method_type, mhtype)); |
662 // NB all oops trashed! | 661 // NB all oops trashed! |
663 assert(HAS_PENDING_EXCEPTION, "should do"); | 662 assert(HAS_PENDING_EXCEPTION, "should do"); |
668 | 667 |
669 // Load up an adapter from the calling type | 668 // Load up an adapter from the calling type |
670 // NB the x86 code for this (in methodHandles_x86.cpp, search for | 669 // NB the x86 code for this (in methodHandles_x86.cpp, search for |
671 // "genericInvoker") is really really odd. I'm hoping it's trying | 670 // "genericInvoker") is really really odd. I'm hoping it's trying |
672 // to accomodate odd VM/class library combinations I can ignore. | 671 // to accomodate odd VM/class library combinations I can ignore. |
673 oop adapter = java_lang_invoke_MethodTypeForm::genericInvoker(form); | 672 oop adapter = NULL; //FIXME: load the adapter from the CP cache |
674 if (adapter == NULL) { | 673 IF (adapter == NULL) { |
675 CALL_VM_NOCHECK_NOFIX( | 674 CALL_VM_NOCHECK_NOFIX( |
676 SharedRuntime::throw_WrongMethodTypeException( | 675 SharedRuntime::throw_WrongMethodTypeException( |
677 thread, method_type, mhtype)); | 676 thread, method_type, mhtype)); |
678 // NB all oops trashed! | 677 // NB all oops trashed! |
679 assert(HAS_PENDING_EXCEPTION, "should do"); | 678 assert(HAS_PENDING_EXCEPTION, "should do"); |
759 // NB all oops trashed! | 758 // NB all oops trashed! |
760 assert(HAS_PENDING_EXCEPTION, "should do"); | 759 assert(HAS_PENDING_EXCEPTION, "should do"); |
761 return; | 760 return; |
762 } | 761 } |
763 if (entry_kind != MethodHandles::_invokespecial_mh) { | 762 if (entry_kind != MethodHandles::_invokespecial_mh) { |
764 int index = java_lang_invoke_DirectMethodHandle::vmindex(method_handle); | 763 intptr_t index = java_lang_invoke_DirectMethodHandle::vmindex(method_handle); |
765 instanceKlass* rcvrKlass = | 764 instanceKlass* rcvrKlass = |
766 (instanceKlass *) receiver->klass()->klass_part(); | 765 (instanceKlass *) receiver->klass()->klass_part(); |
767 if (entry_kind == MethodHandles::_invokevirtual_mh) { | 766 if (entry_kind == MethodHandles::_invokevirtual_mh) { |
768 method = (methodOop) rcvrKlass->start_of_vtable()[index]; | 767 method = (methodOop) rcvrKlass->start_of_vtable()[index]; |
769 } | 768 } |
1177 } | 1176 } |
1178 | 1177 |
1179 intptr_t* CppInterpreter::calculate_unwind_sp(ZeroStack* stack, | 1178 intptr_t* CppInterpreter::calculate_unwind_sp(ZeroStack* stack, |
1180 oop method_handle) { | 1179 oop method_handle) { |
1181 oop method_type = java_lang_invoke_MethodHandle::type(method_handle); | 1180 oop method_type = java_lang_invoke_MethodHandle::type(method_handle); |
1182 oop form = java_lang_invoke_MethodType::form(method_type); | 1181 int argument_slots = java_lang_invoke_MethodType::ptype_slot_count(method_type); |
1183 int argument_slots = java_lang_invoke_MethodTypeForm::vmslots(form); | |
1184 | 1182 |
1185 return stack->sp() + argument_slots; | 1183 return stack->sp() + argument_slots; |
1186 } | 1184 } |
1187 | 1185 |
1188 IRT_ENTRY(void, CppInterpreter::throw_exception(JavaThread* thread, | 1186 IRT_ENTRY(void, CppInterpreter::throw_exception(JavaThread* thread, |