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; |