hotspot/src/share/vm/prims/methodHandles.cpp
changeset 43929 9a572e758c9b
parent 43665 4bb003cad9b9
child 44738 11431bbc9549
child 46327 91576389a517
equal deleted inserted replaced
43785:1ea025bbd11d 43929:9a572e758c9b
   174     }
   174     }
   175   }
   175   }
   176   return NULL;
   176   return NULL;
   177 }
   177 }
   178 
   178 
   179 oop MethodHandles::init_method_MemberName(Handle mname, CallInfo& info) {
   179 oop MethodHandles::init_method_MemberName(Handle mname, CallInfo& info, bool intern) {
   180   assert(info.resolved_appendix().is_null(), "only normal methods here");
   180   assert(info.resolved_appendix().is_null(), "only normal methods here");
   181   methodHandle m = info.resolved_method();
   181   methodHandle m = info.resolved_method();
   182   assert(m.not_null(), "null method handle");
   182   assert(m.not_null(), "null method handle");
   183   KlassHandle m_klass = m->method_holder();
   183   KlassHandle m_klass = m->method_holder();
   184   assert(m.not_null(), "null holder for method handle");
   184   assert(m.not_null(), "null holder for method handle");
   275   // The clazz must be eagerly stored, because it provides a GC
   275   // The clazz must be eagerly stored, because it provides a GC
   276   // root to help keep alive the Method*.
   276   // root to help keep alive the Method*.
   277   // If relevant, the vtable or itable value is stored as vmindex.
   277   // If relevant, the vtable or itable value is stored as vmindex.
   278   // This is done eagerly, since it is readily available without
   278   // This is done eagerly, since it is readily available without
   279   // constructing any new objects.
   279   // constructing any new objects.
   280   // TO DO: maybe intern mname_oop
   280   return m->method_holder()->add_member_name(mname, intern);
   281   if (m->method_holder()->add_member_name(mname)) {
       
   282     return mname();
       
   283   } else {
       
   284     // Redefinition caused this to fail.  Return NULL (and an exception?)
       
   285     return NULL;
       
   286   }
       
   287 }
   281 }
   288 
   282 
   289 oop MethodHandles::init_field_MemberName(Handle mname, fieldDescriptor& fd, bool is_setter) {
   283 oop MethodHandles::init_field_MemberName(Handle mname, fieldDescriptor& fd, bool is_setter) {
   290   int flags = (jushort)( fd.access_flags().as_short() & JVM_RECOGNIZED_FIELD_MODIFIERS );
   284   int flags = (jushort)( fd.access_flags().as_short() & JVM_RECOGNIZED_FIELD_MODIFIERS );
   291   flags |= IS_FIELD | ((fd.is_static() ? JVM_REF_getStatic : JVM_REF_getField) << REFERENCE_KIND_SHIFT);
   285   flags |= IS_FIELD | ((fd.is_static() ? JVM_REF_getStatic : JVM_REF_getField) << REFERENCE_KIND_SHIFT);
   971       } else if (rfill < rlimit) {
   965       } else if (rfill < rlimit) {
   972         Handle result(thread, results->obj_at(rfill++));
   966         Handle result(thread, results->obj_at(rfill++));
   973         if (!java_lang_invoke_MemberName::is_instance(result()))
   967         if (!java_lang_invoke_MemberName::is_instance(result()))
   974           return -99;  // caller bug!
   968           return -99;  // caller bug!
   975         CallInfo info(m);
   969         CallInfo info(m);
   976         oop saved = MethodHandles::init_method_MemberName(result, info);
   970         // Since this is going through the methods to create MemberNames, don't search
       
   971         // for matching methods already in the table
       
   972         oop saved = MethodHandles::init_method_MemberName(result, info, /*intern*/false);
   977         if (saved != result())
   973         if (saved != result())
   978           results->obj_at_put(rfill-1, saved);  // show saved instance to user
   974           results->obj_at_put(rfill-1, saved);  // show saved instance to user
   979       } else if (++overflow >= overflow_limit) {
   975       } else if (++overflow >= overflow_limit) {
   980         match_flags = 0; break; // got tired of looking at overflow
   976         match_flags = 0; break; // got tired of looking at overflow
   981       }
   977       }
  1052     jweak ref = this->at(idx);
  1048     jweak ref = this->at(idx);
  1053     JNIHandles::destroy_weak_global(ref);
  1049     JNIHandles::destroy_weak_global(ref);
  1054   }
  1050   }
  1055 }
  1051 }
  1056 
  1052 
  1057 void MemberNameTable::add_member_name(jweak mem_name_wref) {
  1053 oop MemberNameTable::add_member_name(jweak mem_name_wref) {
  1058   assert_locked_or_safepoint(MemberNameTable_lock);
  1054   assert_locked_or_safepoint(MemberNameTable_lock);
  1059   this->push(mem_name_wref);
  1055   this->push(mem_name_wref);
       
  1056   return JNIHandles::resolve(mem_name_wref);
       
  1057 }
       
  1058 
       
  1059 oop MemberNameTable::find_or_add_member_name(jweak mem_name_wref) {
       
  1060   assert_locked_or_safepoint(MemberNameTable_lock);
       
  1061   oop new_mem_name = JNIHandles::resolve(mem_name_wref);
       
  1062 
       
  1063   // Find matching member name in the list.
       
  1064   // This is linear because these are short lists.
       
  1065   int len = this->length();
       
  1066   int new_index = len;
       
  1067   for (int idx = 0; idx < len; idx++) {
       
  1068     oop mname = JNIHandles::resolve(this->at(idx));
       
  1069     if (mname == NULL) {
       
  1070       new_index = idx;
       
  1071       continue;
       
  1072     }
       
  1073     if (java_lang_invoke_MemberName::equals(new_mem_name, mname)) {
       
  1074       JNIHandles::destroy_weak_global(mem_name_wref);
       
  1075       return mname;
       
  1076     }
       
  1077   }
       
  1078   // Not found, push the new one, or reuse empty slot
       
  1079   this->at_put_grow(new_index, mem_name_wref);
       
  1080   return new_mem_name;
  1060 }
  1081 }
  1061 
  1082 
  1062 #if INCLUDE_JVMTI
  1083 #if INCLUDE_JVMTI
  1063 // It is called at safepoint only for RedefineClasses
  1084 // It is called at safepoint only for RedefineClasses
  1064 void MemberNameTable::adjust_method_entries(InstanceKlass* holder, bool * trace_name_printed) {
  1085 void MemberNameTable::adjust_method_entries(InstanceKlass* holder, bool * trace_name_printed) {