805 |
805 |
806 // caching this method should be just fine |
806 // caching this method should be just fine |
807 return false; |
807 return false; |
808 } |
808 } |
809 |
809 |
|
810 bool methodOopDesc::is_method_handle_invoke_name(vmSymbols::SID name_sid) { |
|
811 switch (name_sid) { |
|
812 case vmSymbols::VM_SYMBOL_ENUM_NAME(invoke_name): // FIXME: remove this transitional form |
|
813 case vmSymbols::VM_SYMBOL_ENUM_NAME(invokeExact_name): |
|
814 case vmSymbols::VM_SYMBOL_ENUM_NAME(invokeGeneric_name): |
|
815 return true; |
|
816 } |
|
817 return false; |
|
818 } |
|
819 |
810 // Constant pool structure for invoke methods: |
820 // Constant pool structure for invoke methods: |
811 enum { |
821 enum { |
812 _imcp_invoke_name = 1, // utf8: 'invoke' |
822 _imcp_invoke_name = 1, // utf8: 'invokeExact' or 'invokeGeneric' |
813 _imcp_invoke_signature, // utf8: (variable symbolOop) |
823 _imcp_invoke_signature, // utf8: (variable symbolOop) |
814 _imcp_method_type_value, // string: (variable java/dyn/MethodType, sic) |
824 _imcp_method_type_value, // string: (variable java/dyn/MethodType, sic) |
815 _imcp_limit |
825 _imcp_limit |
816 }; |
826 }; |
817 |
827 |
837 //------------------------------------------------------------------------------ |
847 //------------------------------------------------------------------------------ |
838 // methodOopDesc::is_method_handle_adapter |
848 // methodOopDesc::is_method_handle_adapter |
839 // |
849 // |
840 // Tests if this method is an internal adapter frame from the |
850 // Tests if this method is an internal adapter frame from the |
841 // MethodHandleCompiler. |
851 // MethodHandleCompiler. |
|
852 // Must be consistent with MethodHandleCompiler::get_method_oop(). |
842 bool methodOopDesc::is_method_handle_adapter() const { |
853 bool methodOopDesc::is_method_handle_adapter() const { |
843 return ((name() == vmSymbols::invoke_name() && |
854 return (is_method_handle_invoke_name(name()) && |
844 method_holder() == SystemDictionary::MethodHandle_klass()) |
855 is_synthetic() && |
845 || |
856 MethodHandleCompiler::klass_is_method_handle_adapter_holder(method_holder())); |
846 method_holder() == SystemDictionary::InvokeDynamic_klass()); |
|
847 } |
857 } |
848 |
858 |
849 methodHandle methodOopDesc::make_invoke_method(KlassHandle holder, |
859 methodHandle methodOopDesc::make_invoke_method(KlassHandle holder, |
|
860 symbolHandle name, |
850 symbolHandle signature, |
861 symbolHandle signature, |
851 Handle method_type, TRAPS) { |
862 Handle method_type, TRAPS) { |
852 methodHandle empty; |
863 methodHandle empty; |
853 |
864 |
854 assert(holder() == SystemDictionary::MethodHandle_klass(), |
865 assert(holder() == SystemDictionary::MethodHandle_klass(), |
863 constantPoolHandle cp; |
874 constantPoolHandle cp; |
864 { |
875 { |
865 constantPoolOop cp_oop = oopFactory::new_constantPool(_imcp_limit, IsSafeConc, CHECK_(empty)); |
876 constantPoolOop cp_oop = oopFactory::new_constantPool(_imcp_limit, IsSafeConc, CHECK_(empty)); |
866 cp = constantPoolHandle(THREAD, cp_oop); |
877 cp = constantPoolHandle(THREAD, cp_oop); |
867 } |
878 } |
868 cp->symbol_at_put(_imcp_invoke_name, vmSymbols::invoke_name()); |
879 cp->symbol_at_put(_imcp_invoke_name, name()); |
869 cp->symbol_at_put(_imcp_invoke_signature, signature()); |
880 cp->symbol_at_put(_imcp_invoke_signature, signature()); |
870 cp->string_at_put(_imcp_method_type_value, vmSymbols::void_signature()); |
881 cp->string_at_put(_imcp_method_type_value, vmSymbols::void_signature()); |
871 cp->set_pool_holder(holder()); |
882 cp->set_pool_holder(holder()); |
872 |
883 |
873 // set up the fancy stuff: |
884 // set up the fancy stuff: |
880 m = methodHandle(THREAD, m_oop); |
891 m = methodHandle(THREAD, m_oop); |
881 } |
892 } |
882 m->set_constants(cp()); |
893 m->set_constants(cp()); |
883 m->set_name_index(_imcp_invoke_name); |
894 m->set_name_index(_imcp_invoke_name); |
884 m->set_signature_index(_imcp_invoke_signature); |
895 m->set_signature_index(_imcp_invoke_signature); |
885 assert(m->name() == vmSymbols::invoke_name(), ""); |
896 assert(is_method_handle_invoke_name(m->name()), ""); |
886 assert(m->signature() == signature(), ""); |
897 assert(m->signature() == signature(), ""); |
887 #ifdef CC_INTERP |
898 #ifdef CC_INTERP |
888 ResultTypeFinder rtf(signature()); |
899 ResultTypeFinder rtf(signature()); |
889 m->set_result_index(rtf.type()); |
900 m->set_result_index(rtf.type()); |
890 #endif |
901 #endif |
1031 // pretend it is the corresponding method in the non-strict class: |
1042 // pretend it is the corresponding method in the non-strict class: |
1032 klass_id = vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_Math); |
1043 klass_id = vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_Math); |
1033 id = vmIntrinsics::find_id(klass_id, name_id, sig_id, flags); |
1044 id = vmIntrinsics::find_id(klass_id, name_id, sig_id, flags); |
1034 break; |
1045 break; |
1035 } |
1046 } |
|
1047 break; |
|
1048 |
|
1049 // Signature-polymorphic methods: MethodHandle.invoke*, InvokeDynamic.*. |
|
1050 case vmSymbols::VM_SYMBOL_ENUM_NAME(java_dyn_MethodHandle): |
|
1051 if (is_static() || !is_native()) break; |
|
1052 switch (name_id) { |
|
1053 case vmSymbols::VM_SYMBOL_ENUM_NAME(invokeGeneric_name): |
|
1054 id = vmIntrinsics::_invokeGeneric; break; |
|
1055 default: |
|
1056 if (is_method_handle_invoke_name(name())) |
|
1057 id = vmIntrinsics::_invokeExact; |
|
1058 break; |
|
1059 } |
|
1060 break; |
|
1061 case vmSymbols::VM_SYMBOL_ENUM_NAME(java_dyn_InvokeDynamic): |
|
1062 if (!is_static() || !is_native()) break; |
|
1063 id = vmIntrinsics::_invokeDynamic; |
|
1064 break; |
1036 } |
1065 } |
1037 |
1066 |
1038 if (id != vmIntrinsics::_none) { |
1067 if (id != vmIntrinsics::_none) { |
1039 // Set up its iid. It is an alias method. |
1068 // Set up its iid. It is an alias method. |
1040 set_intrinsic_id(id); |
1069 set_intrinsic_id(id); |