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