< prev index next >

src/hotspot/share/prims/methodHandles.cpp

Print this page


 202       return init_method_MemberName(mname, info);
 203     }
 204   } else if (target_klass == SystemDictionary::reflect_Constructor_klass()) {
 205     oop clazz  = java_lang_reflect_Constructor::clazz(target_oop);
 206     int slot   = java_lang_reflect_Constructor::slot(target_oop);
 207     Klass* k = java_lang_Class::as_Klass(clazz);
 208     if (k != NULL && k->is_instance_klass()) {
 209       Method* m = InstanceKlass::cast(k)->method_with_idnum(slot);
 210       if (m == NULL)  return NULL;
 211       CallInfo info(m, k, CHECK_NULL);
 212       return init_method_MemberName(mname, info);
 213     }
 214   }
 215   return NULL;
 216 }
 217 
 218 oop MethodHandles::init_method_MemberName(Handle mname, CallInfo& info) {
 219   assert(info.resolved_appendix().is_null(), "only normal methods here");
 220   methodHandle m = info.resolved_method();
 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,
 268                  m->name_and_sig_as_C_string(), m2->name_and_sig_as_C_string());
 269         }
 270 #endif //ASSERT
 271       }
 272       if (!m->is_public()) {
 273         assert(m->is_public(), "virtual call must be to public interface method");
 274         return NULL;  // elicit an error later in product build
 275       }
 276       assert(info.resolved_klass()->is_subtype_of(m_klass_non_interface), "virtual call must be type-safe");
 277       m_klass = m_klass_non_interface;
 278     }
 279     if (TraceInvokeDynamic) {
 280       ttyLocker ttyl;




 202       return init_method_MemberName(mname, info);
 203     }
 204   } else if (target_klass == SystemDictionary::reflect_Constructor_klass()) {
 205     oop clazz  = java_lang_reflect_Constructor::clazz(target_oop);
 206     int slot   = java_lang_reflect_Constructor::slot(target_oop);
 207     Klass* k = java_lang_Class::as_Klass(clazz);
 208     if (k != NULL && k->is_instance_klass()) {
 209       Method* m = InstanceKlass::cast(k)->method_with_idnum(slot);
 210       if (m == NULL)  return NULL;
 211       CallInfo info(m, k, CHECK_NULL);
 212       return init_method_MemberName(mname, info);
 213     }
 214   }
 215   return NULL;
 216 }
 217 
 218 oop MethodHandles::init_method_MemberName(Handle mname, CallInfo& info) {
 219   assert(info.resolved_appendix().is_null(), "only normal methods here");
 220   methodHandle m = info.resolved_method();
 221   assert(m.not_null(), "null method handle");
 222   InstanceKlass* 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       assert(info.resolved_klass()->is_instance_klass(), "subtype of interface must be an instance klass");
 261       InstanceKlass* m_klass_non_interface = InstanceKlass::cast(info.resolved_klass());
 262       if (m_klass_non_interface->is_interface()) {
 263         m_klass_non_interface = SystemDictionary::Object_klass();
 264 #ifdef ASSERT
 265         { ResourceMark rm;
 266           Method* m2 = m_klass_non_interface->vtable().method_at(vmindex);
 267           assert(m->name() == m2->name() && m->signature() == m2->signature(),
 268                  "at %d, %s != %s", vmindex,
 269                  m->name_and_sig_as_C_string(), m2->name_and_sig_as_C_string());
 270         }
 271 #endif //ASSERT
 272       }
 273       if (!m->is_public()) {
 274         assert(m->is_public(), "virtual call must be to public interface method");
 275         return NULL;  // elicit an error later in product build
 276       }
 277       assert(info.resolved_klass()->is_subtype_of(m_klass_non_interface), "virtual call must be type-safe");
 278       m_klass = m_klass_non_interface;
 279     }
 280     if (TraceInvokeDynamic) {
 281       ttyLocker ttyl;


< prev index next >