< prev index next >

src/share/vm/prims/methodHandles.cpp

Print this page




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


< prev index next >