comparison src/share/vm/oops/methodOop.cpp @ 1793:d257356e35f0

6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions Reviewed-by: never
author jrose
date Mon, 13 Sep 2010 23:24:30 -0700
parents d5d065957597
children a222fcfba398
comparison
equal deleted inserted replaced
1792:d20603ee9e10 1793:d257356e35f0
817 return false; 817 return false;
818 } 818 }
819 819
820 bool methodOopDesc::is_method_handle_invoke_name(vmSymbols::SID name_sid) { 820 bool methodOopDesc::is_method_handle_invoke_name(vmSymbols::SID name_sid) {
821 switch (name_sid) { 821 switch (name_sid) {
822 case vmSymbols::VM_SYMBOL_ENUM_NAME(invoke_name): // FIXME: remove this transitional form
823 case vmSymbols::VM_SYMBOL_ENUM_NAME(invokeExact_name): 822 case vmSymbols::VM_SYMBOL_ENUM_NAME(invokeExact_name):
824 case vmSymbols::VM_SYMBOL_ENUM_NAME(invokeGeneric_name): 823 case vmSymbols::VM_SYMBOL_ENUM_NAME(invokeGeneric_name):
825 return true; 824 return true;
826 } 825 }
826 if (AllowTransitionalJSR292
827 && name_sid == vmSymbols::VM_SYMBOL_ENUM_NAME(invoke_name))
828 return true;
827 return false; 829 return false;
828 } 830 }
829 831
830 // Constant pool structure for invoke methods: 832 // Constant pool structure for invoke methods:
831 enum { 833 enum {
909 m->set_constants(cp()); 911 m->set_constants(cp());
910 m->set_name_index(_imcp_invoke_name); 912 m->set_name_index(_imcp_invoke_name);
911 m->set_signature_index(_imcp_invoke_signature); 913 m->set_signature_index(_imcp_invoke_signature);
912 assert(is_method_handle_invoke_name(m->name()), ""); 914 assert(is_method_handle_invoke_name(m->name()), "");
913 assert(m->signature() == signature(), ""); 915 assert(m->signature() == signature(), "");
916 assert(m->is_method_handle_invoke(), "");
914 #ifdef CC_INTERP 917 #ifdef CC_INTERP
915 ResultTypeFinder rtf(signature()); 918 ResultTypeFinder rtf(signature());
916 m->set_result_index(rtf.type()); 919 m->set_result_index(rtf.type());
917 #endif 920 #endif
918 m->compute_size_of_parameters(THREAD); 921 m->compute_size_of_parameters(THREAD);
919 m->set_exception_table(Universe::the_empty_int_array()); 922 m->set_exception_table(Universe::the_empty_int_array());
923 m->init_intrinsic_id();
924 assert(m->intrinsic_id() == vmIntrinsics::_invokeExact ||
925 m->intrinsic_id() == vmIntrinsics::_invokeGeneric, "must be an invoker");
920 926
921 // Finally, set up its entry points. 927 // Finally, set up its entry points.
922 assert(m->method_handle_type() == method_type(), ""); 928 assert(m->method_handle_type() == method_type(), "");
923 assert(m->can_be_statically_bound(), ""); 929 assert(m->can_be_statically_bound(), "");
924 m->set_vtable_index(methodOopDesc::nonvirtual_vtable_index); 930 m->set_vtable_index(methodOopDesc::nonvirtual_vtable_index);
1027 1033
1028 void methodOopDesc::init_intrinsic_id() { 1034 void methodOopDesc::init_intrinsic_id() {
1029 assert(_intrinsic_id == vmIntrinsics::_none, "do this just once"); 1035 assert(_intrinsic_id == vmIntrinsics::_none, "do this just once");
1030 const uintptr_t max_id_uint = right_n_bits((int)(sizeof(_intrinsic_id) * BitsPerByte)); 1036 const uintptr_t max_id_uint = right_n_bits((int)(sizeof(_intrinsic_id) * BitsPerByte));
1031 assert((uintptr_t)vmIntrinsics::ID_LIMIT <= max_id_uint, "else fix size"); 1037 assert((uintptr_t)vmIntrinsics::ID_LIMIT <= max_id_uint, "else fix size");
1038 assert(intrinsic_id_size_in_bytes() == sizeof(_intrinsic_id), "");
1032 1039
1033 // the klass name is well-known: 1040 // the klass name is well-known:
1034 vmSymbols::SID klass_id = klass_id_for_intrinsics(method_holder()); 1041 vmSymbols::SID klass_id = klass_id_for_intrinsics(method_holder());
1035 assert(klass_id != vmSymbols::NO_SID, "caller responsibility"); 1042 assert(klass_id != vmSymbols::NO_SID, "caller responsibility");
1036 1043
1037 // ditto for method and signature: 1044 // ditto for method and signature:
1038 vmSymbols::SID name_id = vmSymbols::find_sid(name()); 1045 vmSymbols::SID name_id = vmSymbols::find_sid(name());
1039 if (name_id == vmSymbols::NO_SID) return; 1046 if (name_id == vmSymbols::NO_SID) return;
1040 vmSymbols::SID sig_id = vmSymbols::find_sid(signature()); 1047 vmSymbols::SID sig_id = vmSymbols::find_sid(signature());
1041 if (sig_id == vmSymbols::NO_SID) return; 1048 if (klass_id != vmSymbols::VM_SYMBOL_ENUM_NAME(java_dyn_MethodHandle)
1049 && sig_id == vmSymbols::NO_SID) return;
1042 jshort flags = access_flags().as_short(); 1050 jshort flags = access_flags().as_short();
1043 1051
1044 vmIntrinsics::ID id = vmIntrinsics::find_id(klass_id, name_id, sig_id, flags); 1052 vmIntrinsics::ID id = vmIntrinsics::find_id(klass_id, name_id, sig_id, flags);
1045 if (id != vmIntrinsics::_none) { 1053 if (id != vmIntrinsics::_none) {
1046 set_intrinsic_id(id); 1054 set_intrinsic_id(id);
1065 // Signature-polymorphic methods: MethodHandle.invoke*, InvokeDynamic.*. 1073 // Signature-polymorphic methods: MethodHandle.invoke*, InvokeDynamic.*.
1066 case vmSymbols::VM_SYMBOL_ENUM_NAME(java_dyn_MethodHandle): 1074 case vmSymbols::VM_SYMBOL_ENUM_NAME(java_dyn_MethodHandle):
1067 if (is_static() || !is_native()) break; 1075 if (is_static() || !is_native()) break;
1068 switch (name_id) { 1076 switch (name_id) {
1069 case vmSymbols::VM_SYMBOL_ENUM_NAME(invokeGeneric_name): 1077 case vmSymbols::VM_SYMBOL_ENUM_NAME(invokeGeneric_name):
1070 id = vmIntrinsics::_invokeGeneric; break; 1078 id = vmIntrinsics::_invokeGeneric;
1071 default: 1079 break;
1072 if (is_method_handle_invoke_name(name())) 1080 case vmSymbols::VM_SYMBOL_ENUM_NAME(invokeExact_name):
1073 id = vmIntrinsics::_invokeExact; 1081 id = vmIntrinsics::_invokeExact;
1082 break;
1083 case vmSymbols::VM_SYMBOL_ENUM_NAME(invoke_name):
1084 if (AllowTransitionalJSR292) id = vmIntrinsics::_invokeExact;
1074 break; 1085 break;
1075 } 1086 }
1076 break; 1087 break;
1077 case vmSymbols::VM_SYMBOL_ENUM_NAME(java_dyn_InvokeDynamic): 1088 case vmSymbols::VM_SYMBOL_ENUM_NAME(java_dyn_InvokeDynamic):
1078 if (!is_static() || !is_native()) break; 1089 if (!is_static() || !is_native()) break;