Mercurial > hg > graal-jvmci-8
comparison src/share/vm/prims/methodHandles.cpp @ 14909:4ca6dc0799b6
Backout jdk9 merge
author | Gilles Duboscq <duboscq@ssw.jku.at> |
---|---|
date | Tue, 01 Apr 2014 13:57:07 +0200 |
parents | d8041d695d19 |
children | 89152779163c |
comparison
equal
deleted
inserted
replaced
14908:8db6e76cb658 | 14909:4ca6dc0799b6 |
---|---|
173 return NULL; | 173 return NULL; |
174 } | 174 } |
175 | 175 |
176 oop MethodHandles::init_method_MemberName(Handle mname, CallInfo& info) { | 176 oop MethodHandles::init_method_MemberName(Handle mname, CallInfo& info) { |
177 assert(info.resolved_appendix().is_null(), "only normal methods here"); | 177 assert(info.resolved_appendix().is_null(), "only normal methods here"); |
178 KlassHandle receiver_limit = info.resolved_klass(); | |
178 methodHandle m = info.resolved_method(); | 179 methodHandle m = info.resolved_method(); |
179 KlassHandle m_klass = m->method_holder(); | |
180 int flags = (jushort)( m->access_flags().as_short() & JVM_RECOGNIZED_METHOD_MODIFIERS ); | 180 int flags = (jushort)( m->access_flags().as_short() & JVM_RECOGNIZED_METHOD_MODIFIERS ); |
181 int vmindex = Method::invalid_vtable_index; | 181 int vmindex = Method::invalid_vtable_index; |
182 | 182 |
183 switch (info.call_kind()) { | 183 switch (info.call_kind()) { |
184 case CallInfo::itable_call: | 184 case CallInfo::itable_call: |
185 vmindex = info.itable_index(); | 185 vmindex = info.itable_index(); |
186 // More importantly, the itable index only works with the method holder. | 186 // More importantly, the itable index only works with the method holder. |
187 assert(m_klass->verify_itable_index(vmindex), ""); | 187 receiver_limit = m->method_holder(); |
188 assert(receiver_limit->verify_itable_index(vmindex), ""); | |
188 flags |= IS_METHOD | (JVM_REF_invokeInterface << REFERENCE_KIND_SHIFT); | 189 flags |= IS_METHOD | (JVM_REF_invokeInterface << REFERENCE_KIND_SHIFT); |
189 if (TraceInvokeDynamic) { | 190 if (TraceInvokeDynamic) { |
190 ResourceMark rm; | 191 ResourceMark rm; |
191 tty->print_cr("memberName: invokeinterface method_holder::method: %s, itableindex: %d, access_flags:", | 192 tty->print_cr("memberName: invokeinterface method_holder::method: %s, receiver: %s, itableindex: %d, access_flags:", |
192 Method::name_and_sig_as_C_string(m->method_holder(), m->name(), m->signature()), | 193 Method::name_and_sig_as_C_string(receiver_limit(), m->name(), m->signature()), |
193 vmindex); | 194 receiver_limit()->internal_name(), vmindex); |
194 m->access_flags().print_on(tty); | 195 m->access_flags().print_on(tty); |
195 if (!m->is_abstract()) { | 196 if (!m->is_abstract()) { |
196 tty->print("default"); | 197 tty->print("default"); |
197 } | 198 } |
198 tty->cr(); | 199 tty->cr(); |
200 break; | 201 break; |
201 | 202 |
202 case CallInfo::vtable_call: | 203 case CallInfo::vtable_call: |
203 vmindex = info.vtable_index(); | 204 vmindex = info.vtable_index(); |
204 flags |= IS_METHOD | (JVM_REF_invokeVirtual << REFERENCE_KIND_SHIFT); | 205 flags |= IS_METHOD | (JVM_REF_invokeVirtual << REFERENCE_KIND_SHIFT); |
205 assert(info.resolved_klass()->is_subtype_of(m_klass()), "virtual call must be type-safe"); | 206 assert(receiver_limit->is_subtype_of(m->method_holder()), "virtual call must be type-safe"); |
206 if (m_klass->is_interface()) { | |
207 // This is a vtable call to an interface method (abstract "miranda method" or default method). | |
208 // The vtable index is meaningless without a class (not interface) receiver type, so get one. | |
209 // (LinkResolver should help us figure this out.) | |
210 KlassHandle m_klass_non_interface = info.resolved_klass(); | |
211 if (m_klass_non_interface->is_interface()) { | |
212 m_klass_non_interface = SystemDictionary::Object_klass(); | |
213 #ifdef ASSERT | |
214 { ResourceMark rm; | |
215 Method* m2 = m_klass_non_interface->vtable()->method_at(vmindex); | |
216 assert(m->name() == m2->name() && m->signature() == m2->signature(), | |
217 err_msg("at %d, %s != %s", vmindex, | |
218 m->name_and_sig_as_C_string(), m2->name_and_sig_as_C_string())); | |
219 } | |
220 #endif //ASSERT | |
221 } | |
222 if (!m->is_public()) { | |
223 assert(m->is_public(), "virtual call must be to public interface method"); | |
224 return NULL; // elicit an error later in product build | |
225 } | |
226 assert(info.resolved_klass()->is_subtype_of(m_klass_non_interface()), "virtual call must be type-safe"); | |
227 m_klass = m_klass_non_interface; | |
228 } | |
229 if (TraceInvokeDynamic) { | 207 if (TraceInvokeDynamic) { |
230 ResourceMark rm; | 208 ResourceMark rm; |
231 tty->print_cr("memberName: invokevirtual method_holder::method: %s, receiver: %s, vtableindex: %d, access_flags:", | 209 tty->print_cr("memberName: invokevirtual method_holder::method: %s, receiver: %s, vtableindex: %d, access_flags:", |
232 Method::name_and_sig_as_C_string(m->method_holder(), m->name(), m->signature()), | 210 Method::name_and_sig_as_C_string(receiver_limit(), m->name(), m->signature()), |
233 m_klass->internal_name(), vmindex); | 211 receiver_limit()->internal_name(), vmindex); |
234 m->access_flags().print_on(tty); | 212 m->access_flags().print_on(tty); |
235 if (m->is_default_method()) { | 213 if (m->is_default_method()) { |
236 tty->print("default"); | 214 tty->print("default"); |
237 } | 215 } |
238 tty->cr(); | 216 tty->cr(); |
243 vmindex = Method::nonvirtual_vtable_index; | 221 vmindex = Method::nonvirtual_vtable_index; |
244 if (m->is_static()) { | 222 if (m->is_static()) { |
245 flags |= IS_METHOD | (JVM_REF_invokeStatic << REFERENCE_KIND_SHIFT); | 223 flags |= IS_METHOD | (JVM_REF_invokeStatic << REFERENCE_KIND_SHIFT); |
246 } else if (m->is_initializer()) { | 224 } else if (m->is_initializer()) { |
247 flags |= IS_CONSTRUCTOR | (JVM_REF_invokeSpecial << REFERENCE_KIND_SHIFT); | 225 flags |= IS_CONSTRUCTOR | (JVM_REF_invokeSpecial << REFERENCE_KIND_SHIFT); |
226 assert(receiver_limit == m->method_holder(), "constructor call must be exactly typed"); | |
248 } else { | 227 } else { |
249 flags |= IS_METHOD | (JVM_REF_invokeSpecial << REFERENCE_KIND_SHIFT); | 228 flags |= IS_METHOD | (JVM_REF_invokeSpecial << REFERENCE_KIND_SHIFT); |
229 assert(receiver_limit->is_subtype_of(m->method_holder()), "special call must be type-safe"); | |
250 } | 230 } |
251 break; | 231 break; |
252 | 232 |
253 default: assert(false, "bad CallInfo"); return NULL; | 233 default: assert(false, "bad CallInfo"); return NULL; |
254 } | 234 } |
260 | 240 |
261 oop mname_oop = mname(); | 241 oop mname_oop = mname(); |
262 java_lang_invoke_MemberName::set_flags( mname_oop, flags); | 242 java_lang_invoke_MemberName::set_flags( mname_oop, flags); |
263 java_lang_invoke_MemberName::set_vmtarget(mname_oop, m()); | 243 java_lang_invoke_MemberName::set_vmtarget(mname_oop, m()); |
264 java_lang_invoke_MemberName::set_vmindex( mname_oop, vmindex); // vtable/itable index | 244 java_lang_invoke_MemberName::set_vmindex( mname_oop, vmindex); // vtable/itable index |
265 java_lang_invoke_MemberName::set_clazz( mname_oop, m_klass->java_mirror()); | 245 java_lang_invoke_MemberName::set_clazz( mname_oop, receiver_limit->java_mirror()); |
266 // Note: name and type can be lazily computed by resolve_MemberName, | 246 // Note: name and type can be lazily computed by resolve_MemberName, |
267 // if Java code needs them as resolved String and MethodType objects. | 247 // if Java code needs them as resolved String and MethodType objects. |
268 // The clazz must be eagerly stored, because it provides a GC | 248 // The clazz must be eagerly stored, because it provides a GC |
269 // root to help keep alive the Method*. | 249 // root to help keep alive the Method*. |
270 // If relevant, the vtable or itable value is stored as vmindex. | 250 // If relevant, the vtable or itable value is stored as vmindex. |
587 | 567 |
588 | 568 |
589 // An unresolved member name is a mere symbolic reference. | 569 // An unresolved member name is a mere symbolic reference. |
590 // Resolving it plants a vmtarget/vmindex in it, | 570 // Resolving it plants a vmtarget/vmindex in it, |
591 // which refers directly to JVM internals. | 571 // which refers directly to JVM internals. |
592 Handle MethodHandles::resolve_MemberName(Handle mname, KlassHandle caller, TRAPS) { | 572 Handle MethodHandles::resolve_MemberName(Handle mname, TRAPS) { |
593 Handle empty; | 573 Handle empty; |
594 assert(java_lang_invoke_MemberName::is_instance(mname()), ""); | 574 assert(java_lang_invoke_MemberName::is_instance(mname()), ""); |
595 | 575 |
596 if (java_lang_invoke_MemberName::vmtarget(mname()) != NULL) { | 576 if (java_lang_invoke_MemberName::vmtarget(mname()) != NULL) { |
597 // Already resolved. | 577 // Already resolved. |
664 CallInfo result; | 644 CallInfo result; |
665 { | 645 { |
666 assert(!HAS_PENDING_EXCEPTION, ""); | 646 assert(!HAS_PENDING_EXCEPTION, ""); |
667 if (ref_kind == JVM_REF_invokeStatic) { | 647 if (ref_kind == JVM_REF_invokeStatic) { |
668 LinkResolver::resolve_static_call(result, | 648 LinkResolver::resolve_static_call(result, |
669 defc, name, type, caller, caller.not_null(), false, THREAD); | 649 defc, name, type, KlassHandle(), false, false, THREAD); |
670 } else if (ref_kind == JVM_REF_invokeInterface) { | 650 } else if (ref_kind == JVM_REF_invokeInterface) { |
671 LinkResolver::resolve_interface_call(result, Handle(), defc, | 651 LinkResolver::resolve_interface_call(result, Handle(), defc, |
672 defc, name, type, caller, caller.not_null(), false, THREAD); | 652 defc, name, type, KlassHandle(), false, false, THREAD); |
673 } else if (mh_invoke_id != vmIntrinsics::_none) { | 653 } else if (mh_invoke_id != vmIntrinsics::_none) { |
674 assert(!is_signature_polymorphic_static(mh_invoke_id), ""); | 654 assert(!is_signature_polymorphic_static(mh_invoke_id), ""); |
675 LinkResolver::resolve_handle_call(result, | 655 LinkResolver::resolve_handle_call(result, |
676 defc, name, type, caller, THREAD); | 656 defc, name, type, KlassHandle(), THREAD); |
677 } else if (ref_kind == JVM_REF_invokeSpecial) { | 657 } else if (ref_kind == JVM_REF_invokeSpecial) { |
678 LinkResolver::resolve_special_call(result, | 658 LinkResolver::resolve_special_call(result, |
679 defc, name, type, caller, caller.not_null(), THREAD); | 659 defc, name, type, KlassHandle(), false, THREAD); |
680 } else if (ref_kind == JVM_REF_invokeVirtual) { | 660 } else if (ref_kind == JVM_REF_invokeVirtual) { |
681 LinkResolver::resolve_virtual_call(result, Handle(), defc, | 661 LinkResolver::resolve_virtual_call(result, Handle(), defc, |
682 defc, name, type, caller, caller.not_null(), false, THREAD); | 662 defc, name, type, KlassHandle(), false, false, THREAD); |
683 } else { | 663 } else { |
684 assert(false, err_msg("ref_kind=%d", ref_kind)); | 664 assert(false, err_msg("ref_kind=%d", ref_kind)); |
685 } | 665 } |
686 if (HAS_PENDING_EXCEPTION) { | 666 if (HAS_PENDING_EXCEPTION) { |
687 return empty; | 667 return empty; |
701 CallInfo result; | 681 CallInfo result; |
702 { | 682 { |
703 assert(!HAS_PENDING_EXCEPTION, ""); | 683 assert(!HAS_PENDING_EXCEPTION, ""); |
704 if (name == vmSymbols::object_initializer_name()) { | 684 if (name == vmSymbols::object_initializer_name()) { |
705 LinkResolver::resolve_special_call(result, | 685 LinkResolver::resolve_special_call(result, |
706 defc, name, type, caller, caller.not_null(), THREAD); | 686 defc, name, type, KlassHandle(), false, THREAD); |
707 } else { | 687 } else { |
708 break; // will throw after end of switch | 688 break; // will throw after end of switch |
709 } | 689 } |
710 if (HAS_PENDING_EXCEPTION) { | 690 if (HAS_PENDING_EXCEPTION) { |
711 return empty; | 691 return empty; |
718 case IS_FIELD: | 698 case IS_FIELD: |
719 { | 699 { |
720 fieldDescriptor result; // find_field initializes fd if found | 700 fieldDescriptor result; // find_field initializes fd if found |
721 { | 701 { |
722 assert(!HAS_PENDING_EXCEPTION, ""); | 702 assert(!HAS_PENDING_EXCEPTION, ""); |
723 LinkResolver::resolve_field(result, defc, name, type, caller, Bytecodes::_nop, false, false, THREAD); | 703 LinkResolver::resolve_field(result, defc, name, type, KlassHandle(), Bytecodes::_nop, false, false, THREAD); |
724 if (HAS_PENDING_EXCEPTION) { | 704 if (HAS_PENDING_EXCEPTION) { |
725 return empty; | 705 return empty; |
726 } | 706 } |
727 } | 707 } |
728 oop mname2 = init_field_MemberName(mname, result, ref_kind_is_setter(ref_kind)); | 708 oop mname2 = init_field_MemberName(mname, result, ref_kind_is_setter(ref_kind)); |
1139 THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), reference_klass->external_name()); | 1119 THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), reference_klass->external_name()); |
1140 } | 1120 } |
1141 } | 1121 } |
1142 } | 1122 } |
1143 | 1123 |
1144 KlassHandle caller(THREAD, | 1124 Handle resolved = MethodHandles::resolve_MemberName(mname, CHECK_NULL); |
1145 caller_jh == NULL ? (Klass*) NULL : | |
1146 java_lang_Class::as_Klass(JNIHandles::resolve_non_null(caller_jh))); | |
1147 Handle resolved = MethodHandles::resolve_MemberName(mname, caller, CHECK_NULL); | |
1148 | |
1149 if (resolved.is_null()) { | 1125 if (resolved.is_null()) { |
1150 int flags = java_lang_invoke_MemberName::flags(mname()); | 1126 int flags = java_lang_invoke_MemberName::flags(mname()); |
1151 int ref_kind = (flags >> REFERENCE_KIND_SHIFT) & REFERENCE_KIND_MASK; | 1127 int ref_kind = (flags >> REFERENCE_KIND_SHIFT) & REFERENCE_KIND_MASK; |
1152 if (!MethodHandles::ref_kind_is_valid(ref_kind)) { | 1128 if (!MethodHandles::ref_kind_is_valid(ref_kind)) { |
1153 THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), "obsolete MemberName format"); | 1129 THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), "obsolete MemberName format"); |