hotspot/src/share/vm/prims/methodHandles.cpp
changeset 40102 23ff468d69b4
parent 39289 a17f754703e5
child 42664 29142a56c193
equal deleted inserted replaced
40101:3b8101f0fd65 40102:23ff468d69b4
   176     }
   176     }
   177   }
   177   }
   178   return NULL;
   178   return NULL;
   179 }
   179 }
   180 
   180 
   181 oop MethodHandles::init_method_MemberName(Handle mname, CallInfo& info, bool intern) {
   181 oop MethodHandles::init_method_MemberName(Handle mname, CallInfo& info) {
   182   assert(info.resolved_appendix().is_null(), "only normal methods here");
   182   assert(info.resolved_appendix().is_null(), "only normal methods here");
   183   methodHandle m = info.resolved_method();
   183   methodHandle m = info.resolved_method();
   184   assert(m.not_null(), "null method handle");
   184   assert(m.not_null(), "null method handle");
   185   KlassHandle m_klass = m->method_holder();
   185   KlassHandle m_klass = m->method_holder();
   186   assert(m.not_null(), "null holder for method handle");
   186   assert(m.not_null(), "null holder for method handle");
   277   // The clazz must be eagerly stored, because it provides a GC
   277   // The clazz must be eagerly stored, because it provides a GC
   278   // root to help keep alive the Method*.
   278   // root to help keep alive the Method*.
   279   // If relevant, the vtable or itable value is stored as vmindex.
   279   // If relevant, the vtable or itable value is stored as vmindex.
   280   // This is done eagerly, since it is readily available without
   280   // This is done eagerly, since it is readily available without
   281   // constructing any new objects.
   281   // constructing any new objects.
   282   return m->method_holder()->add_member_name(mname, intern);
   282   // TO DO: maybe intern mname_oop
       
   283   if (m->method_holder()->add_member_name(mname)) {
       
   284     return mname();
       
   285   } else {
       
   286     // Redefinition caused this to fail.  Return NULL (and an exception?)
       
   287     return NULL;
       
   288   }
   283 }
   289 }
   284 
   290 
   285 oop MethodHandles::init_field_MemberName(Handle mname, fieldDescriptor& fd, bool is_setter) {
   291 oop MethodHandles::init_field_MemberName(Handle mname, fieldDescriptor& fd, bool is_setter) {
   286   int flags = (jushort)( fd.access_flags().as_short() & JVM_RECOGNIZED_FIELD_MODIFIERS );
   292   int flags = (jushort)( fd.access_flags().as_short() & JVM_RECOGNIZED_FIELD_MODIFIERS );
   287   flags |= IS_FIELD | ((fd.is_static() ? JVM_REF_getStatic : JVM_REF_getField) << REFERENCE_KIND_SHIFT);
   293   flags |= IS_FIELD | ((fd.is_static() ? JVM_REF_getStatic : JVM_REF_getField) << REFERENCE_KIND_SHIFT);
   967       } else if (rfill < rlimit) {
   973       } else if (rfill < rlimit) {
   968         Handle result(thread, results->obj_at(rfill++));
   974         Handle result(thread, results->obj_at(rfill++));
   969         if (!java_lang_invoke_MemberName::is_instance(result()))
   975         if (!java_lang_invoke_MemberName::is_instance(result()))
   970           return -99;  // caller bug!
   976           return -99;  // caller bug!
   971         CallInfo info(m);
   977         CallInfo info(m);
   972         // Since this is going through the methods to create MemberNames, don't search
   978         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())
   979         if (saved != result())
   976           results->obj_at_put(rfill-1, saved);  // show saved instance to user
   980           results->obj_at_put(rfill-1, saved);  // show saved instance to user
   977       } else if (++overflow >= overflow_limit) {
   981       } else if (++overflow >= overflow_limit) {
   978         match_flags = 0; break; // got tired of looking at overflow
   982         match_flags = 0; break; // got tired of looking at overflow
   979       }
   983       }
  1050     jweak ref = this->at(idx);
  1054     jweak ref = this->at(idx);
  1051     JNIHandles::destroy_weak_global(ref);
  1055     JNIHandles::destroy_weak_global(ref);
  1052   }
  1056   }
  1053 }
  1057 }
  1054 
  1058 
  1055 oop MemberNameTable::add_member_name(jweak mem_name_wref) {
  1059 void MemberNameTable::add_member_name(jweak mem_name_wref) {
  1056   assert_locked_or_safepoint(MemberNameTable_lock);
  1060   assert_locked_or_safepoint(MemberNameTable_lock);
  1057   this->push(mem_name_wref);
  1061   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 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 }
  1062 }
  1084 
  1063 
  1085 #if INCLUDE_JVMTI
  1064 #if INCLUDE_JVMTI
  1086 // It is called at safepoint only for RedefineClasses
  1065 // It is called at safepoint only for RedefineClasses
  1087 void MemberNameTable::adjust_method_entries(InstanceKlass* holder, bool * trace_name_printed) {
  1066 void MemberNameTable::adjust_method_entries(InstanceKlass* holder, bool * trace_name_printed) {