211 }
212 tty->cr();
213 }
214 break;
215
216 case CallInfo::vtable_call:
217 vmindex = info.vtable_index();
218 flags |= IS_METHOD | (JVM_REF_invokeVirtual << REFERENCE_KIND_SHIFT);
219 assert(info.resolved_klass()->is_subtype_of(m_klass()), "virtual call must be type-safe");
220 if (m_klass->is_interface()) {
221 // This is a vtable call to an interface method (abstract "miranda method" or default method).
222 // The vtable index is meaningless without a class (not interface) receiver type, so get one.
223 // (LinkResolver should help us figure this out.)
224 KlassHandle m_klass_non_interface = info.resolved_klass();
225 if (m_klass_non_interface->is_interface()) {
226 m_klass_non_interface = SystemDictionary::Object_klass();
227 #ifdef ASSERT
228 { ResourceMark rm;
229 Method* m2 = m_klass_non_interface->vtable()->method_at(vmindex);
230 assert(m->name() == m2->name() && m->signature() == m2->signature(),
231 err_msg("at %d, %s != %s", vmindex,
232 m->name_and_sig_as_C_string(), m2->name_and_sig_as_C_string()));
233 }
234 #endif //ASSERT
235 }
236 if (!m->is_public()) {
237 assert(m->is_public(), "virtual call must be to public interface method");
238 return NULL; // elicit an error later in product build
239 }
240 assert(info.resolved_klass()->is_subtype_of(m_klass_non_interface()), "virtual call must be type-safe");
241 m_klass = m_klass_non_interface;
242 }
243 if (TraceInvokeDynamic) {
244 ResourceMark rm;
245 tty->print_cr("memberName: invokevirtual method_holder::method: %s, receiver: %s, vtableindex: %d, access_flags:",
246 Method::name_and_sig_as_C_string(m->method_holder(), m->name(), m->signature()),
247 m_klass->internal_name(), vmindex);
248 m->access_flags().print_on(tty);
249 if (m->is_default_method()) {
250 tty->print("default");
251 }
252 tty->cr();
328 // * It has a return type of Object.
329 // * It has the ACC_VARARGS and ACC_NATIVE flags set.
330 bool MethodHandles::is_method_handle_invoke_name(Klass* klass, Symbol* name) {
331 if (klass == NULL)
332 return false;
333 // The following test will fail spuriously during bootstrap of MethodHandle itself:
334 // if (klass != SystemDictionary::MethodHandle_klass())
335 // Test the name instead:
336 if (klass->name() != vmSymbols::java_lang_invoke_MethodHandle())
337 return false;
338 Symbol* poly_sig = vmSymbols::object_array_object_signature();
339 Method* m = InstanceKlass::cast(klass)->find_method(name, poly_sig);
340 if (m == NULL) return false;
341 int required = JVM_ACC_NATIVE | JVM_ACC_VARARGS;
342 int flags = m->access_flags().as_int();
343 return (flags & required) == required;
344 }
345
346
347 Symbol* MethodHandles::signature_polymorphic_intrinsic_name(vmIntrinsics::ID iid) {
348 assert(is_signature_polymorphic_intrinsic(iid), err_msg("iid=%d", iid));
349 switch (iid) {
350 case vmIntrinsics::_invokeBasic: return vmSymbols::invokeBasic_name();
351 case vmIntrinsics::_linkToVirtual: return vmSymbols::linkToVirtual_name();
352 case vmIntrinsics::_linkToStatic: return vmSymbols::linkToStatic_name();
353 case vmIntrinsics::_linkToSpecial: return vmSymbols::linkToSpecial_name();
354 case vmIntrinsics::_linkToInterface: return vmSymbols::linkToInterface_name();
355 }
356 assert(false, "");
357 return 0;
358 }
359
360 int MethodHandles::signature_polymorphic_intrinsic_ref_kind(vmIntrinsics::ID iid) {
361 switch (iid) {
362 case vmIntrinsics::_invokeBasic: return 0;
363 case vmIntrinsics::_linkToVirtual: return JVM_REF_invokeVirtual;
364 case vmIntrinsics::_linkToStatic: return JVM_REF_invokeStatic;
365 case vmIntrinsics::_linkToSpecial: return JVM_REF_invokeSpecial;
366 case vmIntrinsics::_linkToInterface: return JVM_REF_invokeInterface;
367 }
368 assert(false, err_msg("iid=%d", iid));
369 return 0;
370 }
371
372 vmIntrinsics::ID MethodHandles::signature_polymorphic_name_id(Symbol* name) {
373 vmSymbols::SID name_id = vmSymbols::find_sid(name);
374 switch (name_id) {
375 // The ID _invokeGeneric stands for all non-static signature-polymorphic methods, except built-ins.
376 case vmSymbols::VM_SYMBOL_ENUM_NAME(invoke_name): return vmIntrinsics::_invokeGeneric;
377 // The only built-in non-static signature-polymorphic method is MethodHandle.invokeBasic:
378 case vmSymbols::VM_SYMBOL_ENUM_NAME(invokeBasic_name): return vmIntrinsics::_invokeBasic;
379
380 // There is one static signature-polymorphic method for each JVM invocation mode.
381 case vmSymbols::VM_SYMBOL_ENUM_NAME(linkToVirtual_name): return vmIntrinsics::_linkToVirtual;
382 case vmSymbols::VM_SYMBOL_ENUM_NAME(linkToStatic_name): return vmIntrinsics::_linkToStatic;
383 case vmSymbols::VM_SYMBOL_ENUM_NAME(linkToSpecial_name): return vmIntrinsics::_linkToSpecial;
384 case vmSymbols::VM_SYMBOL_ENUM_NAME(linkToInterface_name): return vmIntrinsics::_linkToInterface;
385 }
386
387 // Cover the case of invokeExact and any future variants of invokeFoo.
388 Klass* mh_klass = SystemDictionary::well_known_klass(
681 CallInfo result;
682 LinkInfo link_info(defc, name, type, caller, caller.not_null());
683 {
684 assert(!HAS_PENDING_EXCEPTION, "");
685 if (ref_kind == JVM_REF_invokeStatic) {
686 LinkResolver::resolve_static_call(result,
687 link_info, false, THREAD);
688 } else if (ref_kind == JVM_REF_invokeInterface) {
689 LinkResolver::resolve_interface_call(result, Handle(), defc,
690 link_info, false, THREAD);
691 } else if (mh_invoke_id != vmIntrinsics::_none) {
692 assert(!is_signature_polymorphic_static(mh_invoke_id), "");
693 LinkResolver::resolve_handle_call(result, link_info, THREAD);
694 } else if (ref_kind == JVM_REF_invokeSpecial) {
695 LinkResolver::resolve_special_call(result,
696 link_info, THREAD);
697 } else if (ref_kind == JVM_REF_invokeVirtual) {
698 LinkResolver::resolve_virtual_call(result, Handle(), defc,
699 link_info, false, THREAD);
700 } else {
701 assert(false, err_msg("ref_kind=%d", ref_kind));
702 }
703 if (HAS_PENDING_EXCEPTION) {
704 return empty;
705 }
706 }
707 if (result.resolved_appendix().not_null()) {
708 // The resolved MemberName must not be accompanied by an appendix argument,
709 // since there is no way to bind this value into the MemberName.
710 // Caller is responsible to prevent this from happening.
711 THROW_MSG_(vmSymbols::java_lang_InternalError(), "appendix", empty);
712 }
713 oop mname2 = init_method_MemberName(mname, result);
714 return Handle(THREAD, mname2);
715 }
716 case IS_CONSTRUCTOR:
717 {
718 CallInfo result;
719 LinkInfo link_info(defc, name, type, caller, caller.not_null());
720 {
721 assert(!HAS_PENDING_EXCEPTION, "");
|
211 }
212 tty->cr();
213 }
214 break;
215
216 case CallInfo::vtable_call:
217 vmindex = info.vtable_index();
218 flags |= IS_METHOD | (JVM_REF_invokeVirtual << REFERENCE_KIND_SHIFT);
219 assert(info.resolved_klass()->is_subtype_of(m_klass()), "virtual call must be type-safe");
220 if (m_klass->is_interface()) {
221 // This is a vtable call to an interface method (abstract "miranda method" or default method).
222 // The vtable index is meaningless without a class (not interface) receiver type, so get one.
223 // (LinkResolver should help us figure this out.)
224 KlassHandle m_klass_non_interface = info.resolved_klass();
225 if (m_klass_non_interface->is_interface()) {
226 m_klass_non_interface = SystemDictionary::Object_klass();
227 #ifdef ASSERT
228 { ResourceMark rm;
229 Method* m2 = m_klass_non_interface->vtable()->method_at(vmindex);
230 assert(m->name() == m2->name() && m->signature() == m2->signature(),
231 "at %d, %s != %s", vmindex,
232 m->name_and_sig_as_C_string(), m2->name_and_sig_as_C_string());
233 }
234 #endif //ASSERT
235 }
236 if (!m->is_public()) {
237 assert(m->is_public(), "virtual call must be to public interface method");
238 return NULL; // elicit an error later in product build
239 }
240 assert(info.resolved_klass()->is_subtype_of(m_klass_non_interface()), "virtual call must be type-safe");
241 m_klass = m_klass_non_interface;
242 }
243 if (TraceInvokeDynamic) {
244 ResourceMark rm;
245 tty->print_cr("memberName: invokevirtual method_holder::method: %s, receiver: %s, vtableindex: %d, access_flags:",
246 Method::name_and_sig_as_C_string(m->method_holder(), m->name(), m->signature()),
247 m_klass->internal_name(), vmindex);
248 m->access_flags().print_on(tty);
249 if (m->is_default_method()) {
250 tty->print("default");
251 }
252 tty->cr();
328 // * It has a return type of Object.
329 // * It has the ACC_VARARGS and ACC_NATIVE flags set.
330 bool MethodHandles::is_method_handle_invoke_name(Klass* klass, Symbol* name) {
331 if (klass == NULL)
332 return false;
333 // The following test will fail spuriously during bootstrap of MethodHandle itself:
334 // if (klass != SystemDictionary::MethodHandle_klass())
335 // Test the name instead:
336 if (klass->name() != vmSymbols::java_lang_invoke_MethodHandle())
337 return false;
338 Symbol* poly_sig = vmSymbols::object_array_object_signature();
339 Method* m = InstanceKlass::cast(klass)->find_method(name, poly_sig);
340 if (m == NULL) return false;
341 int required = JVM_ACC_NATIVE | JVM_ACC_VARARGS;
342 int flags = m->access_flags().as_int();
343 return (flags & required) == required;
344 }
345
346
347 Symbol* MethodHandles::signature_polymorphic_intrinsic_name(vmIntrinsics::ID iid) {
348 assert(is_signature_polymorphic_intrinsic(iid), "iid=%d", iid);
349 switch (iid) {
350 case vmIntrinsics::_invokeBasic: return vmSymbols::invokeBasic_name();
351 case vmIntrinsics::_linkToVirtual: return vmSymbols::linkToVirtual_name();
352 case vmIntrinsics::_linkToStatic: return vmSymbols::linkToStatic_name();
353 case vmIntrinsics::_linkToSpecial: return vmSymbols::linkToSpecial_name();
354 case vmIntrinsics::_linkToInterface: return vmSymbols::linkToInterface_name();
355 }
356 assert(false, "");
357 return 0;
358 }
359
360 int MethodHandles::signature_polymorphic_intrinsic_ref_kind(vmIntrinsics::ID iid) {
361 switch (iid) {
362 case vmIntrinsics::_invokeBasic: return 0;
363 case vmIntrinsics::_linkToVirtual: return JVM_REF_invokeVirtual;
364 case vmIntrinsics::_linkToStatic: return JVM_REF_invokeStatic;
365 case vmIntrinsics::_linkToSpecial: return JVM_REF_invokeSpecial;
366 case vmIntrinsics::_linkToInterface: return JVM_REF_invokeInterface;
367 }
368 assert(false, "iid=%d", iid);
369 return 0;
370 }
371
372 vmIntrinsics::ID MethodHandles::signature_polymorphic_name_id(Symbol* name) {
373 vmSymbols::SID name_id = vmSymbols::find_sid(name);
374 switch (name_id) {
375 // The ID _invokeGeneric stands for all non-static signature-polymorphic methods, except built-ins.
376 case vmSymbols::VM_SYMBOL_ENUM_NAME(invoke_name): return vmIntrinsics::_invokeGeneric;
377 // The only built-in non-static signature-polymorphic method is MethodHandle.invokeBasic:
378 case vmSymbols::VM_SYMBOL_ENUM_NAME(invokeBasic_name): return vmIntrinsics::_invokeBasic;
379
380 // There is one static signature-polymorphic method for each JVM invocation mode.
381 case vmSymbols::VM_SYMBOL_ENUM_NAME(linkToVirtual_name): return vmIntrinsics::_linkToVirtual;
382 case vmSymbols::VM_SYMBOL_ENUM_NAME(linkToStatic_name): return vmIntrinsics::_linkToStatic;
383 case vmSymbols::VM_SYMBOL_ENUM_NAME(linkToSpecial_name): return vmIntrinsics::_linkToSpecial;
384 case vmSymbols::VM_SYMBOL_ENUM_NAME(linkToInterface_name): return vmIntrinsics::_linkToInterface;
385 }
386
387 // Cover the case of invokeExact and any future variants of invokeFoo.
388 Klass* mh_klass = SystemDictionary::well_known_klass(
681 CallInfo result;
682 LinkInfo link_info(defc, name, type, caller, caller.not_null());
683 {
684 assert(!HAS_PENDING_EXCEPTION, "");
685 if (ref_kind == JVM_REF_invokeStatic) {
686 LinkResolver::resolve_static_call(result,
687 link_info, false, THREAD);
688 } else if (ref_kind == JVM_REF_invokeInterface) {
689 LinkResolver::resolve_interface_call(result, Handle(), defc,
690 link_info, false, THREAD);
691 } else if (mh_invoke_id != vmIntrinsics::_none) {
692 assert(!is_signature_polymorphic_static(mh_invoke_id), "");
693 LinkResolver::resolve_handle_call(result, link_info, THREAD);
694 } else if (ref_kind == JVM_REF_invokeSpecial) {
695 LinkResolver::resolve_special_call(result,
696 link_info, THREAD);
697 } else if (ref_kind == JVM_REF_invokeVirtual) {
698 LinkResolver::resolve_virtual_call(result, Handle(), defc,
699 link_info, false, THREAD);
700 } else {
701 assert(false, "ref_kind=%d", ref_kind);
702 }
703 if (HAS_PENDING_EXCEPTION) {
704 return empty;
705 }
706 }
707 if (result.resolved_appendix().not_null()) {
708 // The resolved MemberName must not be accompanied by an appendix argument,
709 // since there is no way to bind this value into the MemberName.
710 // Caller is responsible to prevent this from happening.
711 THROW_MSG_(vmSymbols::java_lang_InternalError(), "appendix", empty);
712 }
713 oop mname2 = init_method_MemberName(mname, result);
714 return Handle(THREAD, mname2);
715 }
716 case IS_CONSTRUCTOR:
717 {
718 CallInfo result;
719 LinkInfo link_info(defc, name, type, caller, caller.not_null());
720 {
721 assert(!HAS_PENDING_EXCEPTION, "");
|