< prev index next >

src/hotspot/share/prims/methodHandles.cpp

Print this page




 221   assert(m.not_null(), "null method handle");
 222   Klass* m_klass = m->method_holder();
 223   assert(m_klass != NULL, "null holder for method handle");
 224   int flags = (jushort)( m->access_flags().as_short() & JVM_RECOGNIZED_METHOD_MODIFIERS );
 225   int vmindex = Method::invalid_vtable_index;
 226 
 227   switch (info.call_kind()) {
 228   case CallInfo::itable_call:
 229     vmindex = info.itable_index();
 230     // More importantly, the itable index only works with the method holder.
 231     assert(m_klass->verify_itable_index(vmindex), "");
 232     flags |= IS_METHOD | (JVM_REF_invokeInterface << REFERENCE_KIND_SHIFT);
 233     if (TraceInvokeDynamic) {
 234       ttyLocker ttyl;
 235       ResourceMark rm;
 236       tty->print_cr("memberName: invokeinterface method_holder::method: %s, itableindex: %d, access_flags:",
 237             Method::name_and_sig_as_C_string(m->method_holder(), m->name(), m->signature()),
 238             vmindex);
 239        m->access_flags().print_on(tty);
 240        if (!m->is_abstract()) {

 241          tty->print("default");
 242        }




 243        tty->cr();
 244     }
 245     break;
 246 
 247   case CallInfo::vtable_call:
 248     vmindex = info.vtable_index();
 249     flags |= IS_METHOD | (JVM_REF_invokeVirtual << REFERENCE_KIND_SHIFT);
 250     assert(info.resolved_klass()->is_subtype_of(m_klass), "virtual call must be type-safe");
 251     if (m_klass->is_interface()) {
 252       // This is a vtable call to an interface method (abstract "miranda method" or default method).
 253       // The vtable index is meaningless without a class (not interface) receiver type, so get one.
 254       // (LinkResolver should help us figure this out.)
 255       Klass* m_klass_non_interface = info.resolved_klass();
 256       if (m_klass_non_interface->is_interface()) {
 257         m_klass_non_interface = SystemDictionary::Object_klass();
 258 #ifdef ASSERT
 259         { ResourceMark rm;
 260           Method* m2 = m_klass_non_interface->vtable().method_at(vmindex);
 261           assert(m->name() == m2->name() && m->signature() == m2->signature(),
 262                  "at %d, %s != %s", vmindex,


 275       ttyLocker ttyl;
 276       ResourceMark rm;
 277       tty->print_cr("memberName: invokevirtual method_holder::method: %s, receiver: %s, vtableindex: %d, access_flags:",
 278             Method::name_and_sig_as_C_string(m->method_holder(), m->name(), m->signature()),
 279             m_klass->internal_name(), vmindex);
 280        m->access_flags().print_on(tty);
 281        if (m->is_default_method()) {
 282          tty->print("default");
 283        }
 284        tty->cr();
 285     }
 286     break;
 287 
 288   case CallInfo::direct_call:
 289     vmindex = Method::nonvirtual_vtable_index;
 290     if (m->is_static()) {
 291       flags |= IS_METHOD      | (JVM_REF_invokeStatic  << REFERENCE_KIND_SHIFT);
 292     } else if (m->is_initializer()) {
 293       flags |= IS_CONSTRUCTOR | (JVM_REF_invokeSpecial << REFERENCE_KIND_SHIFT);
 294     } else {



 295       flags |= IS_METHOD      | (JVM_REF_invokeSpecial << REFERENCE_KIND_SHIFT);
 296     }
 297     break;
 298 
 299   default:  assert(false, "bad CallInfo");  return NULL;
 300   }
 301 
 302   // @CallerSensitive annotation detected
 303   if (m->caller_sensitive()) {
 304     flags |= CALLER_SENSITIVE;
 305   }
 306 
 307   Handle resolved_method = info.resolved_method_name();
 308   assert(java_lang_invoke_ResolvedMethodName::vmtarget(resolved_method()) == m(),
 309          "Should not change after link resolution");
 310 
 311   oop mname_oop = mname();
 312   java_lang_invoke_MemberName::set_flags  (mname_oop, flags);
 313   java_lang_invoke_MemberName::set_method (mname_oop, resolved_method());
 314   java_lang_invoke_MemberName::set_vmindex(mname_oop, vmindex);   // vtable/itable index




 221   assert(m.not_null(), "null method handle");
 222   Klass* m_klass = m->method_holder();
 223   assert(m_klass != NULL, "null holder for method handle");
 224   int flags = (jushort)( m->access_flags().as_short() & JVM_RECOGNIZED_METHOD_MODIFIERS );
 225   int vmindex = Method::invalid_vtable_index;
 226 
 227   switch (info.call_kind()) {
 228   case CallInfo::itable_call:
 229     vmindex = info.itable_index();
 230     // More importantly, the itable index only works with the method holder.
 231     assert(m_klass->verify_itable_index(vmindex), "");
 232     flags |= IS_METHOD | (JVM_REF_invokeInterface << REFERENCE_KIND_SHIFT);
 233     if (TraceInvokeDynamic) {
 234       ttyLocker ttyl;
 235       ResourceMark rm;
 236       tty->print_cr("memberName: invokeinterface method_holder::method: %s, itableindex: %d, access_flags:",
 237             Method::name_and_sig_as_C_string(m->method_holder(), m->name(), m->signature()),
 238             vmindex);
 239        m->access_flags().print_on(tty);
 240        if (!m->is_abstract()) {
 241          if (!m->is_private()) {
 242            tty->print("default");
 243          }
 244          else {
 245            tty->print("private-intf");
 246          }
 247        }
 248        tty->cr();
 249     }
 250     break;
 251 
 252   case CallInfo::vtable_call:
 253     vmindex = info.vtable_index();
 254     flags |= IS_METHOD | (JVM_REF_invokeVirtual << REFERENCE_KIND_SHIFT);
 255     assert(info.resolved_klass()->is_subtype_of(m_klass), "virtual call must be type-safe");
 256     if (m_klass->is_interface()) {
 257       // This is a vtable call to an interface method (abstract "miranda method" or default method).
 258       // The vtable index is meaningless without a class (not interface) receiver type, so get one.
 259       // (LinkResolver should help us figure this out.)
 260       Klass* m_klass_non_interface = info.resolved_klass();
 261       if (m_klass_non_interface->is_interface()) {
 262         m_klass_non_interface = SystemDictionary::Object_klass();
 263 #ifdef ASSERT
 264         { ResourceMark rm;
 265           Method* m2 = m_klass_non_interface->vtable().method_at(vmindex);
 266           assert(m->name() == m2->name() && m->signature() == m2->signature(),
 267                  "at %d, %s != %s", vmindex,


 280       ttyLocker ttyl;
 281       ResourceMark rm;
 282       tty->print_cr("memberName: invokevirtual method_holder::method: %s, receiver: %s, vtableindex: %d, access_flags:",
 283             Method::name_and_sig_as_C_string(m->method_holder(), m->name(), m->signature()),
 284             m_klass->internal_name(), vmindex);
 285        m->access_flags().print_on(tty);
 286        if (m->is_default_method()) {
 287          tty->print("default");
 288        }
 289        tty->cr();
 290     }
 291     break;
 292 
 293   case CallInfo::direct_call:
 294     vmindex = Method::nonvirtual_vtable_index;
 295     if (m->is_static()) {
 296       flags |= IS_METHOD      | (JVM_REF_invokeStatic  << REFERENCE_KIND_SHIFT);
 297     } else if (m->is_initializer()) {
 298       flags |= IS_CONSTRUCTOR | (JVM_REF_invokeSpecial << REFERENCE_KIND_SHIFT);
 299     } else {
 300       // "special" reflects that this is a direct call, not that it
 301       // necessarily originates from an invokespecial. We can also do
 302       // direct calls for private and/or final non-static methods.
 303       flags |= IS_METHOD      | (JVM_REF_invokeSpecial << REFERENCE_KIND_SHIFT);
 304     }
 305     break;
 306 
 307   default:  assert(false, "bad CallInfo");  return NULL;
 308   }
 309 
 310   // @CallerSensitive annotation detected
 311   if (m->caller_sensitive()) {
 312     flags |= CALLER_SENSITIVE;
 313   }
 314 
 315   Handle resolved_method = info.resolved_method_name();
 316   assert(java_lang_invoke_ResolvedMethodName::vmtarget(resolved_method()) == m(),
 317          "Should not change after link resolution");
 318 
 319   oop mname_oop = mname();
 320   java_lang_invoke_MemberName::set_flags  (mname_oop, flags);
 321   java_lang_invoke_MemberName::set_method (mname_oop, resolved_method());
 322   java_lang_invoke_MemberName::set_vmindex(mname_oop, vmindex);   // vtable/itable index


< prev index next >