120 SEARCH_SUPERCLASSES = java_lang_invoke_MemberName::MN_SEARCH_SUPERCLASSES, |
120 SEARCH_SUPERCLASSES = java_lang_invoke_MemberName::MN_SEARCH_SUPERCLASSES, |
121 SEARCH_INTERFACES = java_lang_invoke_MemberName::MN_SEARCH_INTERFACES, |
121 SEARCH_INTERFACES = java_lang_invoke_MemberName::MN_SEARCH_INTERFACES, |
122 ALL_KINDS = IS_METHOD | IS_CONSTRUCTOR | IS_FIELD | IS_TYPE |
122 ALL_KINDS = IS_METHOD | IS_CONSTRUCTOR | IS_FIELD | IS_TYPE |
123 }; |
123 }; |
124 |
124 |
125 Handle MethodHandles::new_MemberName(TRAPS) { |
125 oop MethodHandles::init_MemberName(Handle mname, Handle target, TRAPS) { |
126 Handle empty; |
|
127 InstanceKlass* k = SystemDictionary::MemberName_klass(); |
|
128 if (!k->is_initialized()) k->initialize(CHECK_(empty)); |
|
129 return Handle(THREAD, k->allocate_instance(THREAD)); |
|
130 } |
|
131 |
|
132 oop MethodHandles::init_MemberName(Handle mname, Handle target) { |
|
133 // This method is used from java.lang.invoke.MemberName constructors. |
126 // This method is used from java.lang.invoke.MemberName constructors. |
134 // It fills in the new MemberName from a java.lang.reflect.Member. |
127 // It fills in the new MemberName from a java.lang.reflect.Member. |
135 Thread* thread = Thread::current(); |
128 Thread* thread = Thread::current(); |
136 oop target_oop = target(); |
129 oop target_oop = target(); |
137 Klass* target_klass = target_oop->klass(); |
130 Klass* target_klass = target_oop->klass(); |
157 Klass* k = java_lang_Class::as_Klass(clazz); |
150 Klass* k = java_lang_Class::as_Klass(clazz); |
158 if (k != NULL && k->is_instance_klass()) { |
151 if (k != NULL && k->is_instance_klass()) { |
159 Method* m = InstanceKlass::cast(k)->method_with_idnum(slot); |
152 Method* m = InstanceKlass::cast(k)->method_with_idnum(slot); |
160 if (m == NULL || is_signature_polymorphic(m->intrinsic_id())) |
153 if (m == NULL || is_signature_polymorphic(m->intrinsic_id())) |
161 return NULL; // do not resolve unless there is a concrete signature |
154 return NULL; // do not resolve unless there is a concrete signature |
162 CallInfo info(m, k); |
155 CallInfo info(m, k, CHECK_NULL); |
163 return init_method_MemberName(mname, info); |
156 return init_method_MemberName(mname, info); |
164 } |
157 } |
165 } else if (target_klass == SystemDictionary::reflect_Constructor_klass()) { |
158 } else if (target_klass == SystemDictionary::reflect_Constructor_klass()) { |
166 oop clazz = java_lang_reflect_Constructor::clazz(target_oop); |
159 oop clazz = java_lang_reflect_Constructor::clazz(target_oop); |
167 int slot = java_lang_reflect_Constructor::slot(target_oop); |
160 int slot = java_lang_reflect_Constructor::slot(target_oop); |
168 Klass* k = java_lang_Class::as_Klass(clazz); |
161 Klass* k = java_lang_Class::as_Klass(clazz); |
169 if (k != NULL && k->is_instance_klass()) { |
162 if (k != NULL && k->is_instance_klass()) { |
170 Method* m = InstanceKlass::cast(k)->method_with_idnum(slot); |
163 Method* m = InstanceKlass::cast(k)->method_with_idnum(slot); |
171 if (m == NULL) return NULL; |
164 if (m == NULL) return NULL; |
172 CallInfo info(m, k); |
165 CallInfo info(m, k, CHECK_NULL); |
173 return init_method_MemberName(mname, info); |
166 return init_method_MemberName(mname, info); |
174 } |
167 } |
175 } |
168 } |
176 return NULL; |
169 return NULL; |
177 } |
170 } |
178 |
171 |
179 oop MethodHandles::init_method_MemberName(Handle mname, CallInfo& info, bool intern) { |
172 oop MethodHandles::init_method_MemberName(Handle mname, CallInfo& info) { |
180 assert(info.resolved_appendix().is_null(), "only normal methods here"); |
173 assert(info.resolved_appendix().is_null(), "only normal methods here"); |
181 methodHandle m = info.resolved_method(); |
174 methodHandle m = info.resolved_method(); |
182 assert(m.not_null(), "null method handle"); |
175 assert(m.not_null(), "null method handle"); |
183 Klass* m_klass = m->method_holder(); |
176 Klass* m_klass = m->method_holder(); |
184 assert(m_klass != NULL, "null holder for method handle"); |
177 assert(m_klass != NULL, "null holder for method handle"); |
263 // @CallerSensitive annotation detected |
256 // @CallerSensitive annotation detected |
264 if (m->caller_sensitive()) { |
257 if (m->caller_sensitive()) { |
265 flags |= CALLER_SENSITIVE; |
258 flags |= CALLER_SENSITIVE; |
266 } |
259 } |
267 |
260 |
|
261 Handle resolved_method = info.resolved_method_name(); |
|
262 assert(java_lang_invoke_ResolvedMethodName::vmtarget(resolved_method()) == m(), |
|
263 "Should not change after link resolultion"); |
|
264 |
268 oop mname_oop = mname(); |
265 oop mname_oop = mname(); |
269 java_lang_invoke_MemberName::set_flags( mname_oop, flags); |
266 java_lang_invoke_MemberName::set_flags (mname_oop, flags); |
270 java_lang_invoke_MemberName::set_vmtarget(mname_oop, m()); |
267 java_lang_invoke_MemberName::set_method (mname_oop, resolved_method()); |
271 java_lang_invoke_MemberName::set_vmindex( mname_oop, vmindex); // vtable/itable index |
268 java_lang_invoke_MemberName::set_vmindex(mname_oop, vmindex); // vtable/itable index |
272 java_lang_invoke_MemberName::set_clazz( mname_oop, m_klass->java_mirror()); |
269 java_lang_invoke_MemberName::set_clazz (mname_oop, m_klass->java_mirror()); |
273 // Note: name and type can be lazily computed by resolve_MemberName, |
270 // Note: name and type can be lazily computed by resolve_MemberName, |
274 // if Java code needs them as resolved String and MethodType objects. |
271 // if Java code needs them as resolved String and MethodType objects. |
275 // The clazz must be eagerly stored, because it provides a GC |
|
276 // root to help keep alive the Method*. |
|
277 // If relevant, the vtable or itable value is stored as vmindex. |
272 // If relevant, the vtable or itable value is stored as vmindex. |
278 // This is done eagerly, since it is readily available without |
273 // This is done eagerly, since it is readily available without |
279 // constructing any new objects. |
274 // constructing any new objects. |
280 return m->method_holder()->add_member_name(mname, intern); |
275 return mname(); |
281 } |
276 } |
282 |
277 |
283 oop MethodHandles::init_field_MemberName(Handle mname, fieldDescriptor& fd, bool is_setter) { |
278 oop MethodHandles::init_field_MemberName(Handle mname, fieldDescriptor& fd, bool is_setter) { |
284 int flags = (jushort)( fd.access_flags().as_short() & JVM_RECOGNIZED_FIELD_MODIFIERS ); |
279 int flags = (jushort)( fd.access_flags().as_short() & JVM_RECOGNIZED_FIELD_MODIFIERS ); |
285 flags |= IS_FIELD | ((fd.is_static() ? JVM_REF_getStatic : JVM_REF_getField) << REFERENCE_KIND_SHIFT); |
280 flags |= IS_FIELD | ((fd.is_static() ? JVM_REF_getStatic : JVM_REF_getField) << REFERENCE_KIND_SHIFT); |
286 if (is_setter) flags += ((JVM_REF_putField - JVM_REF_getField) << REFERENCE_KIND_SHIFT); |
281 if (is_setter) flags += ((JVM_REF_putField - JVM_REF_getField) << REFERENCE_KIND_SHIFT); |
287 Metadata* vmtarget = fd.field_holder(); |
|
288 int vmindex = fd.offset(); // determines the field uniquely when combined with static bit |
282 int vmindex = fd.offset(); // determines the field uniquely when combined with static bit |
|
283 |
289 oop mname_oop = mname(); |
284 oop mname_oop = mname(); |
290 java_lang_invoke_MemberName::set_flags(mname_oop, flags); |
285 java_lang_invoke_MemberName::set_flags (mname_oop, flags); |
291 java_lang_invoke_MemberName::set_vmtarget(mname_oop, vmtarget); |
286 java_lang_invoke_MemberName::set_method (mname_oop, NULL); |
292 java_lang_invoke_MemberName::set_vmindex(mname_oop, vmindex); |
287 java_lang_invoke_MemberName::set_vmindex(mname_oop, vmindex); |
293 java_lang_invoke_MemberName::set_clazz(mname_oop, fd.field_holder()->java_mirror()); |
288 java_lang_invoke_MemberName::set_clazz (mname_oop, fd.field_holder()->java_mirror()); |
|
289 |
294 oop type = field_signature_type_or_null(fd.signature()); |
290 oop type = field_signature_type_or_null(fd.signature()); |
295 oop name = field_name_or_null(fd.name()); |
291 oop name = field_name_or_null(fd.name()); |
296 if (name != NULL) |
292 if (name != NULL) |
297 java_lang_invoke_MemberName::set_name(mname_oop, name); |
293 java_lang_invoke_MemberName::set_name(mname_oop, name); |
298 if (type != NULL) |
294 if (type != NULL) |
743 // The resolved MemberName must not be accompanied by an appendix argument, |
739 // The resolved MemberName must not be accompanied by an appendix argument, |
744 // since there is no way to bind this value into the MemberName. |
740 // since there is no way to bind this value into the MemberName. |
745 // Caller is responsible to prevent this from happening. |
741 // Caller is responsible to prevent this from happening. |
746 THROW_MSG_(vmSymbols::java_lang_InternalError(), "appendix", empty); |
742 THROW_MSG_(vmSymbols::java_lang_InternalError(), "appendix", empty); |
747 } |
743 } |
|
744 result.set_resolved_method_name(CHECK_(empty)); |
748 oop mname2 = init_method_MemberName(mname, result); |
745 oop mname2 = init_method_MemberName(mname, result); |
749 return Handle(THREAD, mname2); |
746 return Handle(THREAD, mname2); |
750 } |
747 } |
751 case IS_CONSTRUCTOR: |
748 case IS_CONSTRUCTOR: |
752 { |
749 { |
792 // may have null defc, name, and type fields. |
790 // may have null defc, name, and type fields. |
793 // Resolving it plants a vmtarget/vmindex in it, |
791 // Resolving it plants a vmtarget/vmindex in it, |
794 // which refers directly to JVM internals. |
792 // which refers directly to JVM internals. |
795 void MethodHandles::expand_MemberName(Handle mname, int suppress, TRAPS) { |
793 void MethodHandles::expand_MemberName(Handle mname, int suppress, TRAPS) { |
796 assert(java_lang_invoke_MemberName::is_instance(mname()), ""); |
794 assert(java_lang_invoke_MemberName::is_instance(mname()), ""); |
797 Metadata* vmtarget = java_lang_invoke_MemberName::vmtarget(mname()); |
|
798 int vmindex = java_lang_invoke_MemberName::vmindex(mname()); |
|
799 if (vmtarget == NULL) { |
|
800 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "nothing to expand"); |
|
801 } |
|
802 |
795 |
803 bool have_defc = (java_lang_invoke_MemberName::clazz(mname()) != NULL); |
796 bool have_defc = (java_lang_invoke_MemberName::clazz(mname()) != NULL); |
804 bool have_name = (java_lang_invoke_MemberName::name(mname()) != NULL); |
797 bool have_name = (java_lang_invoke_MemberName::name(mname()) != NULL); |
805 bool have_type = (java_lang_invoke_MemberName::type(mname()) != NULL); |
798 bool have_type = (java_lang_invoke_MemberName::type(mname()) != NULL); |
806 int flags = java_lang_invoke_MemberName::flags(mname()); |
799 int flags = java_lang_invoke_MemberName::flags(mname()); |
815 |
808 |
816 switch (flags & ALL_KINDS) { |
809 switch (flags & ALL_KINDS) { |
817 case IS_METHOD: |
810 case IS_METHOD: |
818 case IS_CONSTRUCTOR: |
811 case IS_CONSTRUCTOR: |
819 { |
812 { |
820 assert(vmtarget->is_method(), "method or constructor vmtarget is Method*"); |
813 Method* vmtarget = java_lang_invoke_MemberName::vmtarget(mname()); |
821 methodHandle m(THREAD, (Method*)vmtarget); |
814 if (vmtarget == NULL) { |
|
815 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "nothing to expand"); |
|
816 } |
|
817 methodHandle m(THREAD, vmtarget); |
822 DEBUG_ONLY(vmtarget = NULL); // safety |
818 DEBUG_ONLY(vmtarget = NULL); // safety |
823 if (m.is_null()) break; |
|
824 if (!have_defc) { |
819 if (!have_defc) { |
825 InstanceKlass* defc = m->method_holder(); |
820 InstanceKlass* defc = m->method_holder(); |
826 java_lang_invoke_MemberName::set_clazz(mname(), defc->java_mirror()); |
821 java_lang_invoke_MemberName::set_clazz(mname(), defc->java_mirror()); |
827 } |
822 } |
828 if (!have_name) { |
823 if (!have_name) { |
836 } |
831 } |
837 return; |
832 return; |
838 } |
833 } |
839 case IS_FIELD: |
834 case IS_FIELD: |
840 { |
835 { |
841 assert(vmtarget->is_klass(), "field vmtarget is Klass*"); |
836 oop clazz = java_lang_invoke_MemberName::clazz(mname()); |
842 if (!((Klass*) vmtarget)->is_instance_klass()) break; |
837 if (clazz == NULL) { |
843 InstanceKlass* defc = InstanceKlass::cast((Klass*) vmtarget); |
838 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "nothing to expand (as field)"); |
844 DEBUG_ONLY(vmtarget = NULL); // safety |
839 } |
|
840 InstanceKlass* defc = InstanceKlass::cast(java_lang_Class::as_Klass(clazz)); |
|
841 DEBUG_ONLY(clazz = NULL); // safety |
|
842 int vmindex = java_lang_invoke_MemberName::vmindex(mname()); |
845 bool is_static = ((flags & JVM_ACC_STATIC) != 0); |
843 bool is_static = ((flags & JVM_ACC_STATIC) != 0); |
846 fieldDescriptor fd; // find_field initializes fd if found |
844 fieldDescriptor fd; // find_field initializes fd if found |
847 if (!defc->find_field_from_offset(vmindex, is_static, &fd)) |
845 if (!defc->find_field_from_offset(vmindex, is_static, &fd)) |
848 break; // cannot expand |
846 break; // cannot expand |
849 if (!have_defc) { |
|
850 java_lang_invoke_MemberName::set_clazz(mname(), defc->java_mirror()); |
|
851 } |
|
852 if (!have_name) { |
847 if (!have_name) { |
853 //not java_lang_String::create_from_symbol; let's intern member names |
848 //not java_lang_String::create_from_symbol; let's intern member names |
854 oop name = StringTable::intern(fd.name(), CHECK); |
849 oop name = StringTable::intern(fd.name(), CHECK); |
855 java_lang_invoke_MemberName::set_name(mname(), name); |
850 java_lang_invoke_MemberName::set_name(mname(), name); |
856 } |
851 } |
869 } |
864 } |
870 |
865 |
871 int MethodHandles::find_MemberNames(Klass* k, |
866 int MethodHandles::find_MemberNames(Klass* k, |
872 Symbol* name, Symbol* sig, |
867 Symbol* name, Symbol* sig, |
873 int mflags, Klass* caller, |
868 int mflags, Klass* caller, |
874 int skip, objArrayHandle results) { |
869 int skip, objArrayHandle results, TRAPS) { |
875 // %%% take caller into account! |
870 // %%% take caller into account! |
876 |
871 |
877 Thread* thread = Thread::current(); |
872 Thread* thread = Thread::current(); |
878 |
873 |
879 if (k == NULL || !k->is_instance_klass()) return -1; |
874 if (k == NULL || !k->is_instance_klass()) return -1; |
966 --rskip; |
961 --rskip; |
967 } else if (rfill < rlimit) { |
962 } else if (rfill < rlimit) { |
968 Handle result(thread, results->obj_at(rfill++)); |
963 Handle result(thread, results->obj_at(rfill++)); |
969 if (!java_lang_invoke_MemberName::is_instance(result())) |
964 if (!java_lang_invoke_MemberName::is_instance(result())) |
970 return -99; // caller bug! |
965 return -99; // caller bug! |
971 CallInfo info(m); |
966 CallInfo info(m, NULL, CHECK_0); |
972 // Since this is going through the methods to create MemberNames, don't search |
967 oop saved = MethodHandles::init_method_MemberName(result, info); |
973 // for matching methods already in the table |
|
974 oop saved = MethodHandles::init_method_MemberName(result, info, /*intern*/false); |
|
975 if (saved != result()) |
968 if (saved != result()) |
976 results->obj_at_put(rfill-1, saved); // show saved instance to user |
969 results->obj_at_put(rfill-1, saved); // show saved instance to user |
977 } else if (++overflow >= overflow_limit) { |
970 } else if (++overflow >= overflow_limit) { |
978 match_flags = 0; break; // got tired of looking at overflow |
971 match_flags = 0; break; // got tired of looking at overflow |
979 } |
972 } |
1030 // At least one nmethod has been marked for deoptimization. |
1023 // At least one nmethod has been marked for deoptimization. |
1031 VM_Deoptimize op; |
1024 VM_Deoptimize op; |
1032 VMThread::execute(&op); |
1025 VMThread::execute(&op); |
1033 } |
1026 } |
1034 } |
1027 } |
1035 |
|
1036 //------------------------------------------------------------------------------ |
|
1037 // MemberNameTable |
|
1038 // |
|
1039 |
|
1040 MemberNameTable::MemberNameTable(int methods_cnt) |
|
1041 : GrowableArray<jweak>(methods_cnt, true) { |
|
1042 assert_locked_or_safepoint(MemberNameTable_lock); |
|
1043 } |
|
1044 |
|
1045 MemberNameTable::~MemberNameTable() { |
|
1046 assert_locked_or_safepoint(MemberNameTable_lock); |
|
1047 int len = this->length(); |
|
1048 |
|
1049 for (int idx = 0; idx < len; idx++) { |
|
1050 jweak ref = this->at(idx); |
|
1051 JNIHandles::destroy_weak_global(ref); |
|
1052 } |
|
1053 } |
|
1054 |
|
1055 oop MemberNameTable::add_member_name(jweak mem_name_wref) { |
|
1056 assert_locked_or_safepoint(MemberNameTable_lock); |
|
1057 this->push(mem_name_wref); |
|
1058 return JNIHandles::resolve(mem_name_wref); |
|
1059 } |
|
1060 |
|
1061 oop MemberNameTable::find_or_add_member_name(jweak mem_name_wref) { |
|
1062 assert_locked_or_safepoint(MemberNameTable_lock); |
|
1063 oop new_mem_name = JNIHandles::resolve(mem_name_wref); |
|
1064 |
|
1065 // Find matching member name in the list. |
|
1066 // This is linear because these are short lists. |
|
1067 int len = this->length(); |
|
1068 int new_index = len; |
|
1069 for (int idx = 0; idx < len; idx++) { |
|
1070 oop mname = JNIHandles::resolve(this->at(idx)); |
|
1071 if (mname == NULL) { |
|
1072 new_index = idx; |
|
1073 continue; |
|
1074 } |
|
1075 if (java_lang_invoke_MemberName::equals(new_mem_name, mname)) { |
|
1076 JNIHandles::destroy_weak_global(mem_name_wref); |
|
1077 return mname; |
|
1078 } |
|
1079 } |
|
1080 // Not found, push the new one, or reuse empty slot |
|
1081 this->at_put_grow(new_index, mem_name_wref); |
|
1082 return new_mem_name; |
|
1083 } |
|
1084 |
|
1085 #if INCLUDE_JVMTI |
|
1086 // It is called at safepoint only for RedefineClasses |
|
1087 void MemberNameTable::adjust_method_entries(InstanceKlass* holder, bool * trace_name_printed) { |
|
1088 assert(SafepointSynchronize::is_at_safepoint(), "only called at safepoint"); |
|
1089 // For each redefined method |
|
1090 for (int idx = 0; idx < length(); idx++) { |
|
1091 oop mem_name = JNIHandles::resolve(this->at(idx)); |
|
1092 if (mem_name == NULL) { |
|
1093 continue; |
|
1094 } |
|
1095 Method* old_method = (Method*)java_lang_invoke_MemberName::vmtarget(mem_name); |
|
1096 |
|
1097 if (old_method == NULL || !old_method->is_old()) { |
|
1098 continue; // skip uninteresting entries |
|
1099 } |
|
1100 if (old_method->is_deleted()) { |
|
1101 // skip entries with deleted methods |
|
1102 continue; |
|
1103 } |
|
1104 Method* new_method = holder->method_with_idnum(old_method->orig_method_idnum()); |
|
1105 |
|
1106 assert(new_method != NULL, "method_with_idnum() should not be NULL"); |
|
1107 assert(old_method != new_method, "sanity check"); |
|
1108 |
|
1109 java_lang_invoke_MemberName::set_vmtarget(mem_name, new_method); |
|
1110 |
|
1111 if (log_is_enabled(Info, redefine, class, update)) { |
|
1112 ResourceMark rm; |
|
1113 if (!(*trace_name_printed)) { |
|
1114 log_info(redefine, class, update)("adjust: name=%s", old_method->method_holder()->external_name()); |
|
1115 *trace_name_printed = true; |
|
1116 } |
|
1117 log_debug(redefine, class, update, constantpool) |
|
1118 ("MemberName method update: %s(%s)", |
|
1119 new_method->name()->as_C_string(), new_method->signature()->as_C_string()); |
|
1120 } |
|
1121 } |
|
1122 } |
|
1123 #endif // INCLUDE_JVMTI |
|
1124 |
1028 |
1125 // |
1029 // |
1126 // Here are the native methods in java.lang.invoke.MethodHandleNatives |
1030 // Here are the native methods in java.lang.invoke.MethodHandleNatives |
1127 // They are the private interface between this JVM and the HotSpot-specific |
1031 // They are the private interface between this JVM and the HotSpot-specific |
1128 // Java code that implements JSR 292 method handles. |
1032 // Java code that implements JSR 292 method handles. |
1199 JVM_ENTRY(void, MHN_init_Mem(JNIEnv *env, jobject igcls, jobject mname_jh, jobject target_jh)) { |
1103 JVM_ENTRY(void, MHN_init_Mem(JNIEnv *env, jobject igcls, jobject mname_jh, jobject target_jh)) { |
1200 if (mname_jh == NULL) { THROW_MSG(vmSymbols::java_lang_InternalError(), "mname is null"); } |
1104 if (mname_jh == NULL) { THROW_MSG(vmSymbols::java_lang_InternalError(), "mname is null"); } |
1201 if (target_jh == NULL) { THROW_MSG(vmSymbols::java_lang_InternalError(), "target is null"); } |
1105 if (target_jh == NULL) { THROW_MSG(vmSymbols::java_lang_InternalError(), "target is null"); } |
1202 Handle mname(THREAD, JNIHandles::resolve_non_null(mname_jh)); |
1106 Handle mname(THREAD, JNIHandles::resolve_non_null(mname_jh)); |
1203 Handle target(THREAD, JNIHandles::resolve_non_null(target_jh)); |
1107 Handle target(THREAD, JNIHandles::resolve_non_null(target_jh)); |
1204 MethodHandles::init_MemberName(mname, target); |
1108 MethodHandles::init_MemberName(mname, target, CHECK); |
1205 } |
1109 } |
1206 JVM_END |
1110 JVM_END |
1207 |
1111 |
1208 // void expand(MemberName self) |
1112 // void expand(MemberName self) |
1209 JVM_ENTRY(void, MHN_expand_Mem(JNIEnv *env, jobject igcls, jobject mname_jh)) { |
1113 JVM_ENTRY(void, MHN_expand_Mem(JNIEnv *env, jobject igcls, jobject mname_jh)) { |
1303 |
1207 |
1304 JVM_ENTRY(jobject, MHN_getMemberVMInfo(JNIEnv *env, jobject igcls, jobject mname_jh)) { |
1208 JVM_ENTRY(jobject, MHN_getMemberVMInfo(JNIEnv *env, jobject igcls, jobject mname_jh)) { |
1305 if (mname_jh == NULL) return NULL; |
1209 if (mname_jh == NULL) return NULL; |
1306 Handle mname(THREAD, JNIHandles::resolve_non_null(mname_jh)); |
1210 Handle mname(THREAD, JNIHandles::resolve_non_null(mname_jh)); |
1307 intptr_t vmindex = java_lang_invoke_MemberName::vmindex(mname()); |
1211 intptr_t vmindex = java_lang_invoke_MemberName::vmindex(mname()); |
1308 Metadata* vmtarget = java_lang_invoke_MemberName::vmtarget(mname()); |
|
1309 objArrayHandle result = oopFactory::new_objArray_handle(SystemDictionary::Object_klass(), 2, CHECK_NULL); |
1212 objArrayHandle result = oopFactory::new_objArray_handle(SystemDictionary::Object_klass(), 2, CHECK_NULL); |
1310 jvalue vmindex_value; vmindex_value.j = (long)vmindex; |
1213 jvalue vmindex_value; vmindex_value.j = (long)vmindex; |
1311 oop x = java_lang_boxing_object::create(T_LONG, &vmindex_value, CHECK_NULL); |
1214 oop x = java_lang_boxing_object::create(T_LONG, &vmindex_value, CHECK_NULL); |
1312 result->obj_at_put(0, x); |
1215 result->obj_at_put(0, x); |
1313 x = NULL; |
1216 |
1314 if (vmtarget == NULL) { |
1217 int flags = java_lang_invoke_MemberName::flags(mname()); |
1315 x = NULL; |
1218 if ((flags & IS_FIELD) != 0) { |
1316 } else if (vmtarget->is_klass()) { |
1219 x = java_lang_invoke_MemberName::clazz(mname()); |
1317 x = ((Klass*) vmtarget)->java_mirror(); |
1220 } else { |
1318 } else if (vmtarget->is_method()) { |
1221 Method* vmtarget = java_lang_invoke_MemberName::vmtarget(mname()); |
|
1222 assert(vmtarget != NULL && vmtarget->is_method(), "vmtarget is only method"); |
1319 x = mname(); |
1223 x = mname(); |
1320 } |
1224 } |
1321 result->obj_at_put(1, x); |
1225 result->obj_at_put(1, x); |
1322 return JNIHandles::make_local(env, result()); |
1226 return JNIHandles::make_local(env, result()); |
1323 } |
1227 } |