Mercurial > hg > graal-jvmci-8
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; |