hotspot/src/share/vm/prims/methodHandles.cpp
changeset 46505 fd4bc78630b1
parent 46458 3c12af929e7d
child 46630 75aa3e39d02c
equal deleted inserted replaced
46504:38048d4d20e7 46505:fd4bc78630b1
   120   SEARCH_SUPERCLASSES  = java_lang_invoke_MemberName::MN_SEARCH_SUPERCLASSES,
   120   SEARCH_SUPERCLASSES  = java_lang_invoke_MemberName::MN_SEARCH_SUPERCLASSES,
   121   SEARCH_INTERFACES    = java_lang_invoke_MemberName::MN_SEARCH_INTERFACES,
   121   SEARCH_INTERFACES    = java_lang_invoke_MemberName::MN_SEARCH_INTERFACES,
   122   ALL_KINDS      = IS_METHOD | IS_CONSTRUCTOR | IS_FIELD | IS_TYPE
   122   ALL_KINDS      = IS_METHOD | IS_CONSTRUCTOR | IS_FIELD | IS_TYPE
   123 };
   123 };
   124 
   124 
   125 Handle MethodHandles::new_MemberName(TRAPS) {
   125 oop MethodHandles::init_MemberName(Handle mname, Handle target, TRAPS) {
   126   Handle empty;
       
   127   InstanceKlass* k = SystemDictionary::MemberName_klass();
       
   128   if (!k->is_initialized())  k->initialize(CHECK_(empty));
       
   129   return Handle(THREAD, k->allocate_instance(THREAD));
       
   130 }
       
   131 
       
   132 oop MethodHandles::init_MemberName(Handle mname, Handle target) {
       
   133   // This method is used from java.lang.invoke.MemberName constructors.
   126   // This method is used from java.lang.invoke.MemberName constructors.
   134   // It fills in the new MemberName from a java.lang.reflect.Member.
   127   // It fills in the new MemberName from a java.lang.reflect.Member.
   135   Thread* thread = Thread::current();
   128   Thread* thread = Thread::current();
   136   oop target_oop = target();
   129   oop target_oop = target();
   137   Klass* target_klass = target_oop->klass();
   130   Klass* target_klass = target_oop->klass();
   157     Klass* k = java_lang_Class::as_Klass(clazz);
   150     Klass* k = java_lang_Class::as_Klass(clazz);
   158     if (k != NULL && k->is_instance_klass()) {
   151     if (k != NULL && k->is_instance_klass()) {
   159       Method* m = InstanceKlass::cast(k)->method_with_idnum(slot);
   152       Method* m = InstanceKlass::cast(k)->method_with_idnum(slot);
   160       if (m == NULL || is_signature_polymorphic(m->intrinsic_id()))
   153       if (m == NULL || is_signature_polymorphic(m->intrinsic_id()))
   161         return NULL;            // do not resolve unless there is a concrete signature
   154         return NULL;            // do not resolve unless there is a concrete signature
   162       CallInfo info(m, k);
   155       CallInfo info(m, k, CHECK_NULL);
   163       return init_method_MemberName(mname, info);
   156       return init_method_MemberName(mname, info);
   164     }
   157     }
   165   } else if (target_klass == SystemDictionary::reflect_Constructor_klass()) {
   158   } else if (target_klass == SystemDictionary::reflect_Constructor_klass()) {
   166     oop clazz  = java_lang_reflect_Constructor::clazz(target_oop);
   159     oop clazz  = java_lang_reflect_Constructor::clazz(target_oop);
   167     int slot   = java_lang_reflect_Constructor::slot(target_oop);
   160     int slot   = java_lang_reflect_Constructor::slot(target_oop);
   168     Klass* k = java_lang_Class::as_Klass(clazz);
   161     Klass* k = java_lang_Class::as_Klass(clazz);
   169     if (k != NULL && k->is_instance_klass()) {
   162     if (k != NULL && k->is_instance_klass()) {
   170       Method* m = InstanceKlass::cast(k)->method_with_idnum(slot);
   163       Method* m = InstanceKlass::cast(k)->method_with_idnum(slot);
   171       if (m == NULL)  return NULL;
   164       if (m == NULL)  return NULL;
   172       CallInfo info(m, k);
   165       CallInfo info(m, k, CHECK_NULL);
   173       return init_method_MemberName(mname, info);
   166       return init_method_MemberName(mname, info);
   174     }
   167     }
   175   }
   168   }
   176   return NULL;
   169   return NULL;
   177 }
   170 }
   178 
   171 
   179 oop MethodHandles::init_method_MemberName(Handle mname, CallInfo& info, bool intern) {
   172 oop MethodHandles::init_method_MemberName(Handle mname, CallInfo& info) {
   180   assert(info.resolved_appendix().is_null(), "only normal methods here");
   173   assert(info.resolved_appendix().is_null(), "only normal methods here");
   181   methodHandle m = info.resolved_method();
   174   methodHandle m = info.resolved_method();
   182   assert(m.not_null(), "null method handle");
   175   assert(m.not_null(), "null method handle");
   183   Klass* m_klass = m->method_holder();
   176   Klass* m_klass = m->method_holder();
   184   assert(m_klass != NULL, "null holder for method handle");
   177   assert(m_klass != NULL, "null holder for method handle");
   263   // @CallerSensitive annotation detected
   256   // @CallerSensitive annotation detected
   264   if (m->caller_sensitive()) {
   257   if (m->caller_sensitive()) {
   265     flags |= CALLER_SENSITIVE;
   258     flags |= CALLER_SENSITIVE;
   266   }
   259   }
   267 
   260 
       
   261   Handle resolved_method = info.resolved_method_name();
       
   262   assert(java_lang_invoke_ResolvedMethodName::vmtarget(resolved_method()) == m(),
       
   263          "Should not change after link resolultion");
       
   264 
   268   oop mname_oop = mname();
   265   oop mname_oop = mname();
   269   java_lang_invoke_MemberName::set_flags(   mname_oop, flags);
   266   java_lang_invoke_MemberName::set_flags  (mname_oop, flags);
   270   java_lang_invoke_MemberName::set_vmtarget(mname_oop, m());
   267   java_lang_invoke_MemberName::set_method (mname_oop, resolved_method());
   271   java_lang_invoke_MemberName::set_vmindex( mname_oop, vmindex);   // vtable/itable index
   268   java_lang_invoke_MemberName::set_vmindex(mname_oop, vmindex);   // vtable/itable index
   272   java_lang_invoke_MemberName::set_clazz(   mname_oop, m_klass->java_mirror());
   269   java_lang_invoke_MemberName::set_clazz  (mname_oop, m_klass->java_mirror());
   273   // Note:  name and type can be lazily computed by resolve_MemberName,
   270   // Note:  name and type can be lazily computed by resolve_MemberName,
   274   // if Java code needs them as resolved String and MethodType objects.
   271   // if Java code needs them as resolved String and MethodType objects.
   275   // The clazz must be eagerly stored, because it provides a GC
       
   276   // root to help keep alive the Method*.
       
   277   // If relevant, the vtable or itable value is stored as vmindex.
   272   // If relevant, the vtable or itable value is stored as vmindex.
   278   // This is done eagerly, since it is readily available without
   273   // This is done eagerly, since it is readily available without
   279   // constructing any new objects.
   274   // constructing any new objects.
   280   return m->method_holder()->add_member_name(mname, intern);
   275   return mname();
   281 }
   276 }
   282 
   277 
   283 oop MethodHandles::init_field_MemberName(Handle mname, fieldDescriptor& fd, bool is_setter) {
   278 oop MethodHandles::init_field_MemberName(Handle mname, fieldDescriptor& fd, bool is_setter) {
   284   int flags = (jushort)( fd.access_flags().as_short() & JVM_RECOGNIZED_FIELD_MODIFIERS );
   279   int flags = (jushort)( fd.access_flags().as_short() & JVM_RECOGNIZED_FIELD_MODIFIERS );
   285   flags |= IS_FIELD | ((fd.is_static() ? JVM_REF_getStatic : JVM_REF_getField) << REFERENCE_KIND_SHIFT);
   280   flags |= IS_FIELD | ((fd.is_static() ? JVM_REF_getStatic : JVM_REF_getField) << REFERENCE_KIND_SHIFT);
   286   if (is_setter)  flags += ((JVM_REF_putField - JVM_REF_getField) << REFERENCE_KIND_SHIFT);
   281   if (is_setter)  flags += ((JVM_REF_putField - JVM_REF_getField) << REFERENCE_KIND_SHIFT);
   287   Metadata* vmtarget = fd.field_holder();
       
   288   int vmindex        = fd.offset();  // determines the field uniquely when combined with static bit
   282   int vmindex        = fd.offset();  // determines the field uniquely when combined with static bit
       
   283 
   289   oop mname_oop = mname();
   284   oop mname_oop = mname();
   290   java_lang_invoke_MemberName::set_flags(mname_oop,    flags);
   285   java_lang_invoke_MemberName::set_flags  (mname_oop, flags);
   291   java_lang_invoke_MemberName::set_vmtarget(mname_oop, vmtarget);
   286   java_lang_invoke_MemberName::set_method (mname_oop, NULL);
   292   java_lang_invoke_MemberName::set_vmindex(mname_oop,  vmindex);
   287   java_lang_invoke_MemberName::set_vmindex(mname_oop, vmindex);
   293   java_lang_invoke_MemberName::set_clazz(mname_oop,    fd.field_holder()->java_mirror());
   288   java_lang_invoke_MemberName::set_clazz  (mname_oop, fd.field_holder()->java_mirror());
       
   289 
   294   oop type = field_signature_type_or_null(fd.signature());
   290   oop type = field_signature_type_or_null(fd.signature());
   295   oop name = field_name_or_null(fd.name());
   291   oop name = field_name_or_null(fd.name());
   296   if (name != NULL)
   292   if (name != NULL)
   297     java_lang_invoke_MemberName::set_name(mname_oop,   name);
   293     java_lang_invoke_MemberName::set_name(mname_oop,   name);
   298   if (type != NULL)
   294   if (type != NULL)
   743         // The resolved MemberName must not be accompanied by an appendix argument,
   739         // The resolved MemberName must not be accompanied by an appendix argument,
   744         // since there is no way to bind this value into the MemberName.
   740         // since there is no way to bind this value into the MemberName.
   745         // Caller is responsible to prevent this from happening.
   741         // Caller is responsible to prevent this from happening.
   746         THROW_MSG_(vmSymbols::java_lang_InternalError(), "appendix", empty);
   742         THROW_MSG_(vmSymbols::java_lang_InternalError(), "appendix", empty);
   747       }
   743       }
       
   744       result.set_resolved_method_name(CHECK_(empty));
   748       oop mname2 = init_method_MemberName(mname, result);
   745       oop mname2 = init_method_MemberName(mname, result);
   749       return Handle(THREAD, mname2);
   746       return Handle(THREAD, mname2);
   750     }
   747     }
   751   case IS_CONSTRUCTOR:
   748   case IS_CONSTRUCTOR:
   752     {
   749     {
   762         if (HAS_PENDING_EXCEPTION) {
   759         if (HAS_PENDING_EXCEPTION) {
   763           return empty;
   760           return empty;
   764         }
   761         }
   765       }
   762       }
   766       assert(result.is_statically_bound(), "");
   763       assert(result.is_statically_bound(), "");
       
   764       result.set_resolved_method_name(CHECK_(empty));
   767       oop mname2 = init_method_MemberName(mname, result);
   765       oop mname2 = init_method_MemberName(mname, result);
   768       return Handle(THREAD, mname2);
   766       return Handle(THREAD, mname2);
   769     }
   767     }
   770   case IS_FIELD:
   768   case IS_FIELD:
   771     {
   769     {
   792 // may have null defc, name, and type fields.
   790 // may have null defc, name, and type fields.
   793 // Resolving it plants a vmtarget/vmindex in it,
   791 // Resolving it plants a vmtarget/vmindex in it,
   794 // which refers directly to JVM internals.
   792 // which refers directly to JVM internals.
   795 void MethodHandles::expand_MemberName(Handle mname, int suppress, TRAPS) {
   793 void MethodHandles::expand_MemberName(Handle mname, int suppress, TRAPS) {
   796   assert(java_lang_invoke_MemberName::is_instance(mname()), "");
   794   assert(java_lang_invoke_MemberName::is_instance(mname()), "");
   797   Metadata* vmtarget = java_lang_invoke_MemberName::vmtarget(mname());
       
   798   int vmindex  = java_lang_invoke_MemberName::vmindex(mname());
       
   799   if (vmtarget == NULL) {
       
   800     THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "nothing to expand");
       
   801   }
       
   802 
   795 
   803   bool have_defc = (java_lang_invoke_MemberName::clazz(mname()) != NULL);
   796   bool have_defc = (java_lang_invoke_MemberName::clazz(mname()) != NULL);
   804   bool have_name = (java_lang_invoke_MemberName::name(mname()) != NULL);
   797   bool have_name = (java_lang_invoke_MemberName::name(mname()) != NULL);
   805   bool have_type = (java_lang_invoke_MemberName::type(mname()) != NULL);
   798   bool have_type = (java_lang_invoke_MemberName::type(mname()) != NULL);
   806   int flags      = java_lang_invoke_MemberName::flags(mname());
   799   int flags      = java_lang_invoke_MemberName::flags(mname());
   815 
   808 
   816   switch (flags & ALL_KINDS) {
   809   switch (flags & ALL_KINDS) {
   817   case IS_METHOD:
   810   case IS_METHOD:
   818   case IS_CONSTRUCTOR:
   811   case IS_CONSTRUCTOR:
   819     {
   812     {
   820       assert(vmtarget->is_method(), "method or constructor vmtarget is Method*");
   813       Method* vmtarget = java_lang_invoke_MemberName::vmtarget(mname());
   821       methodHandle m(THREAD, (Method*)vmtarget);
   814       if (vmtarget == NULL) {
       
   815         THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "nothing to expand");
       
   816       }
       
   817       methodHandle m(THREAD, vmtarget);
   822       DEBUG_ONLY(vmtarget = NULL);  // safety
   818       DEBUG_ONLY(vmtarget = NULL);  // safety
   823       if (m.is_null())  break;
       
   824       if (!have_defc) {
   819       if (!have_defc) {
   825         InstanceKlass* defc = m->method_holder();
   820         InstanceKlass* defc = m->method_holder();
   826         java_lang_invoke_MemberName::set_clazz(mname(), defc->java_mirror());
   821         java_lang_invoke_MemberName::set_clazz(mname(), defc->java_mirror());
   827       }
   822       }
   828       if (!have_name) {
   823       if (!have_name) {
   836       }
   831       }
   837       return;
   832       return;
   838     }
   833     }
   839   case IS_FIELD:
   834   case IS_FIELD:
   840     {
   835     {
   841       assert(vmtarget->is_klass(), "field vmtarget is Klass*");
   836       oop clazz = java_lang_invoke_MemberName::clazz(mname());
   842       if (!((Klass*) vmtarget)->is_instance_klass())  break;
   837       if (clazz == NULL) {
   843       InstanceKlass* defc = InstanceKlass::cast((Klass*) vmtarget);
   838         THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "nothing to expand (as field)");
   844       DEBUG_ONLY(vmtarget = NULL);  // safety
   839       }
       
   840       InstanceKlass* defc = InstanceKlass::cast(java_lang_Class::as_Klass(clazz));
       
   841       DEBUG_ONLY(clazz = NULL);  // safety
       
   842       int vmindex  = java_lang_invoke_MemberName::vmindex(mname());
   845       bool is_static = ((flags & JVM_ACC_STATIC) != 0);
   843       bool is_static = ((flags & JVM_ACC_STATIC) != 0);
   846       fieldDescriptor fd; // find_field initializes fd if found
   844       fieldDescriptor fd; // find_field initializes fd if found
   847       if (!defc->find_field_from_offset(vmindex, is_static, &fd))
   845       if (!defc->find_field_from_offset(vmindex, is_static, &fd))
   848         break;                  // cannot expand
   846         break;                  // cannot expand
   849       if (!have_defc) {
       
   850         java_lang_invoke_MemberName::set_clazz(mname(), defc->java_mirror());
       
   851       }
       
   852       if (!have_name) {
   847       if (!have_name) {
   853         //not java_lang_String::create_from_symbol; let's intern member names
   848         //not java_lang_String::create_from_symbol; let's intern member names
   854         oop name = StringTable::intern(fd.name(), CHECK);
   849         oop name = StringTable::intern(fd.name(), CHECK);
   855         java_lang_invoke_MemberName::set_name(mname(), name);
   850         java_lang_invoke_MemberName::set_name(mname(), name);
   856       }
   851       }
   869 }
   864 }
   870 
   865 
   871 int MethodHandles::find_MemberNames(Klass* k,
   866 int MethodHandles::find_MemberNames(Klass* k,
   872                                     Symbol* name, Symbol* sig,
   867                                     Symbol* name, Symbol* sig,
   873                                     int mflags, Klass* caller,
   868                                     int mflags, Klass* caller,
   874                                     int skip, objArrayHandle results) {
   869                                     int skip, objArrayHandle results, TRAPS) {
   875   // %%% take caller into account!
   870   // %%% take caller into account!
   876 
   871 
   877   Thread* thread = Thread::current();
   872   Thread* thread = Thread::current();
   878 
   873 
   879   if (k == NULL || !k->is_instance_klass())  return -1;
   874   if (k == NULL || !k->is_instance_klass())  return -1;
   966         --rskip;
   961         --rskip;
   967       } else if (rfill < rlimit) {
   962       } else if (rfill < rlimit) {
   968         Handle result(thread, results->obj_at(rfill++));
   963         Handle result(thread, results->obj_at(rfill++));
   969         if (!java_lang_invoke_MemberName::is_instance(result()))
   964         if (!java_lang_invoke_MemberName::is_instance(result()))
   970           return -99;  // caller bug!
   965           return -99;  // caller bug!
   971         CallInfo info(m);
   966         CallInfo info(m, NULL, CHECK_0);
   972         // Since this is going through the methods to create MemberNames, don't search
   967         oop saved = MethodHandles::init_method_MemberName(result, info);
   973         // for matching methods already in the table
       
   974         oop saved = MethodHandles::init_method_MemberName(result, info, /*intern*/false);
       
   975         if (saved != result())
   968         if (saved != result())
   976           results->obj_at_put(rfill-1, saved);  // show saved instance to user
   969           results->obj_at_put(rfill-1, saved);  // show saved instance to user
   977       } else if (++overflow >= overflow_limit) {
   970       } else if (++overflow >= overflow_limit) {
   978         match_flags = 0; break; // got tired of looking at overflow
   971         match_flags = 0; break; // got tired of looking at overflow
   979       }
   972       }
  1030     // At least one nmethod has been marked for deoptimization.
  1023     // At least one nmethod has been marked for deoptimization.
  1031     VM_Deoptimize op;
  1024     VM_Deoptimize op;
  1032     VMThread::execute(&op);
  1025     VMThread::execute(&op);
  1033   }
  1026   }
  1034 }
  1027 }
  1035 
       
  1036 //------------------------------------------------------------------------------
       
  1037 // MemberNameTable
       
  1038 //
       
  1039 
       
  1040 MemberNameTable::MemberNameTable(int methods_cnt)
       
  1041                   : GrowableArray<jweak>(methods_cnt, true) {
       
  1042   assert_locked_or_safepoint(MemberNameTable_lock);
       
  1043 }
       
  1044 
       
  1045 MemberNameTable::~MemberNameTable() {
       
  1046   assert_locked_or_safepoint(MemberNameTable_lock);
       
  1047   int len = this->length();
       
  1048 
       
  1049   for (int idx = 0; idx < len; idx++) {
       
  1050     jweak ref = this->at(idx);
       
  1051     JNIHandles::destroy_weak_global(ref);
       
  1052   }
       
  1053 }
       
  1054 
       
  1055 oop MemberNameTable::add_member_name(jweak mem_name_wref) {
       
  1056   assert_locked_or_safepoint(MemberNameTable_lock);
       
  1057   this->push(mem_name_wref);
       
  1058   return JNIHandles::resolve(mem_name_wref);
       
  1059 }
       
  1060 
       
  1061 oop MemberNameTable::find_or_add_member_name(jweak mem_name_wref) {
       
  1062   assert_locked_or_safepoint(MemberNameTable_lock);
       
  1063   oop new_mem_name = JNIHandles::resolve(mem_name_wref);
       
  1064 
       
  1065   // Find matching member name in the list.
       
  1066   // This is linear because these are short lists.
       
  1067   int len = this->length();
       
  1068   int new_index = len;
       
  1069   for (int idx = 0; idx < len; idx++) {
       
  1070     oop mname = JNIHandles::resolve(this->at(idx));
       
  1071     if (mname == NULL) {
       
  1072       new_index = idx;
       
  1073       continue;
       
  1074     }
       
  1075     if (java_lang_invoke_MemberName::equals(new_mem_name, mname)) {
       
  1076       JNIHandles::destroy_weak_global(mem_name_wref);
       
  1077       return mname;
       
  1078     }
       
  1079   }
       
  1080   // Not found, push the new one, or reuse empty slot
       
  1081   this->at_put_grow(new_index, mem_name_wref);
       
  1082   return new_mem_name;
       
  1083 }
       
  1084 
       
  1085 #if INCLUDE_JVMTI
       
  1086 // It is called at safepoint only for RedefineClasses
       
  1087 void MemberNameTable::adjust_method_entries(InstanceKlass* holder, bool * trace_name_printed) {
       
  1088   assert(SafepointSynchronize::is_at_safepoint(), "only called at safepoint");
       
  1089   // For each redefined method
       
  1090   for (int idx = 0; idx < length(); idx++) {
       
  1091     oop mem_name = JNIHandles::resolve(this->at(idx));
       
  1092     if (mem_name == NULL) {
       
  1093       continue;
       
  1094     }
       
  1095     Method* old_method = (Method*)java_lang_invoke_MemberName::vmtarget(mem_name);
       
  1096 
       
  1097     if (old_method == NULL || !old_method->is_old()) {
       
  1098       continue; // skip uninteresting entries
       
  1099     }
       
  1100     if (old_method->is_deleted()) {
       
  1101       // skip entries with deleted methods
       
  1102       continue;
       
  1103     }
       
  1104     Method* new_method = holder->method_with_idnum(old_method->orig_method_idnum());
       
  1105 
       
  1106     assert(new_method != NULL, "method_with_idnum() should not be NULL");
       
  1107     assert(old_method != new_method, "sanity check");
       
  1108 
       
  1109     java_lang_invoke_MemberName::set_vmtarget(mem_name, new_method);
       
  1110 
       
  1111     if (log_is_enabled(Info, redefine, class, update)) {
       
  1112       ResourceMark rm;
       
  1113       if (!(*trace_name_printed)) {
       
  1114         log_info(redefine, class, update)("adjust: name=%s", old_method->method_holder()->external_name());
       
  1115         *trace_name_printed = true;
       
  1116       }
       
  1117       log_debug(redefine, class, update, constantpool)
       
  1118         ("MemberName method update: %s(%s)",
       
  1119          new_method->name()->as_C_string(), new_method->signature()->as_C_string());
       
  1120     }
       
  1121   }
       
  1122 }
       
  1123 #endif // INCLUDE_JVMTI
       
  1124 
  1028 
  1125 //
  1029 //
  1126 // Here are the native methods in java.lang.invoke.MethodHandleNatives
  1030 // Here are the native methods in java.lang.invoke.MethodHandleNatives
  1127 // They are the private interface between this JVM and the HotSpot-specific
  1031 // They are the private interface between this JVM and the HotSpot-specific
  1128 // Java code that implements JSR 292 method handles.
  1032 // Java code that implements JSR 292 method handles.
  1199 JVM_ENTRY(void, MHN_init_Mem(JNIEnv *env, jobject igcls, jobject mname_jh, jobject target_jh)) {
  1103 JVM_ENTRY(void, MHN_init_Mem(JNIEnv *env, jobject igcls, jobject mname_jh, jobject target_jh)) {
  1200   if (mname_jh == NULL) { THROW_MSG(vmSymbols::java_lang_InternalError(), "mname is null"); }
  1104   if (mname_jh == NULL) { THROW_MSG(vmSymbols::java_lang_InternalError(), "mname is null"); }
  1201   if (target_jh == NULL) { THROW_MSG(vmSymbols::java_lang_InternalError(), "target is null"); }
  1105   if (target_jh == NULL) { THROW_MSG(vmSymbols::java_lang_InternalError(), "target is null"); }
  1202   Handle mname(THREAD, JNIHandles::resolve_non_null(mname_jh));
  1106   Handle mname(THREAD, JNIHandles::resolve_non_null(mname_jh));
  1203   Handle target(THREAD, JNIHandles::resolve_non_null(target_jh));
  1107   Handle target(THREAD, JNIHandles::resolve_non_null(target_jh));
  1204   MethodHandles::init_MemberName(mname, target);
  1108   MethodHandles::init_MemberName(mname, target, CHECK);
  1205 }
  1109 }
  1206 JVM_END
  1110 JVM_END
  1207 
  1111 
  1208 // void expand(MemberName self)
  1112 // void expand(MemberName self)
  1209 JVM_ENTRY(void, MHN_expand_Mem(JNIEnv *env, jobject igcls, jobject mname_jh)) {
  1113 JVM_ENTRY(void, MHN_expand_Mem(JNIEnv *env, jobject igcls, jobject mname_jh)) {
  1264 }
  1168 }
  1265 JVM_END
  1169 JVM_END
  1266 
  1170 
  1267 static jlong find_member_field_offset(oop mname, bool must_be_static, TRAPS) {
  1171 static jlong find_member_field_offset(oop mname, bool must_be_static, TRAPS) {
  1268   if (mname == NULL ||
  1172   if (mname == NULL ||
  1269       java_lang_invoke_MemberName::vmtarget(mname) == NULL) {
  1173       java_lang_invoke_MemberName::clazz(mname) == NULL) {
  1270     THROW_MSG_0(vmSymbols::java_lang_InternalError(), "mname not resolved");
  1174     THROW_MSG_0(vmSymbols::java_lang_InternalError(), "mname not resolved");
  1271   } else {
  1175   } else {
  1272     int flags = java_lang_invoke_MemberName::flags(mname);
  1176     int flags = java_lang_invoke_MemberName::flags(mname);
  1273     if ((flags & IS_FIELD) != 0 &&
  1177     if ((flags & IS_FIELD) != 0 &&
  1274         (must_be_static
  1178         (must_be_static
  1303 
  1207 
  1304 JVM_ENTRY(jobject, MHN_getMemberVMInfo(JNIEnv *env, jobject igcls, jobject mname_jh)) {
  1208 JVM_ENTRY(jobject, MHN_getMemberVMInfo(JNIEnv *env, jobject igcls, jobject mname_jh)) {
  1305   if (mname_jh == NULL)  return NULL;
  1209   if (mname_jh == NULL)  return NULL;
  1306   Handle mname(THREAD, JNIHandles::resolve_non_null(mname_jh));
  1210   Handle mname(THREAD, JNIHandles::resolve_non_null(mname_jh));
  1307   intptr_t vmindex  = java_lang_invoke_MemberName::vmindex(mname());
  1211   intptr_t vmindex  = java_lang_invoke_MemberName::vmindex(mname());
  1308   Metadata* vmtarget = java_lang_invoke_MemberName::vmtarget(mname());
       
  1309   objArrayHandle result = oopFactory::new_objArray_handle(SystemDictionary::Object_klass(), 2, CHECK_NULL);
  1212   objArrayHandle result = oopFactory::new_objArray_handle(SystemDictionary::Object_klass(), 2, CHECK_NULL);
  1310   jvalue vmindex_value; vmindex_value.j = (long)vmindex;
  1213   jvalue vmindex_value; vmindex_value.j = (long)vmindex;
  1311   oop x = java_lang_boxing_object::create(T_LONG, &vmindex_value, CHECK_NULL);
  1214   oop x = java_lang_boxing_object::create(T_LONG, &vmindex_value, CHECK_NULL);
  1312   result->obj_at_put(0, x);
  1215   result->obj_at_put(0, x);
  1313   x = NULL;
  1216 
  1314   if (vmtarget == NULL) {
  1217   int flags = java_lang_invoke_MemberName::flags(mname());
  1315     x = NULL;
  1218   if ((flags & IS_FIELD) != 0) {
  1316   } else if (vmtarget->is_klass()) {
  1219     x = java_lang_invoke_MemberName::clazz(mname());
  1317     x = ((Klass*) vmtarget)->java_mirror();
  1220   } else {
  1318   } else if (vmtarget->is_method()) {
  1221     Method* vmtarget = java_lang_invoke_MemberName::vmtarget(mname());
       
  1222     assert(vmtarget != NULL && vmtarget->is_method(), "vmtarget is only method");
  1319     x = mname();
  1223     x = mname();
  1320   }
  1224   }
  1321   result->obj_at_put(1, x);
  1225   result->obj_at_put(1, x);
  1322   return JNIHandles::make_local(env, result());
  1226   return JNIHandles::make_local(env, result());
  1323 }
  1227 }
  1358     // try a direct resolve
  1262     // try a direct resolve
  1359     // %%% TO DO
  1263     // %%% TO DO
  1360   }
  1264   }
  1361 
  1265 
  1362   int res = MethodHandles::find_MemberNames(k, name, sig, mflags,
  1266   int res = MethodHandles::find_MemberNames(k, name, sig, mflags,
  1363                                             caller, skip, results);
  1267                                             caller, skip, results, CHECK_0);
  1364   // TO DO: expand at least some of the MemberNames, to avoid massive callbacks
  1268   // TO DO: expand at least some of the MemberNames, to avoid massive callbacks
  1365   return res;
  1269   return res;
  1366 }
  1270 }
  1367 JVM_END
  1271 JVM_END
  1368 
  1272