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,