src/share/vm/prims/methodHandles.cpp

changeset 8721
575f637864df
parent 7795
157895117ad5
child 8758
e7db67a9ddfd
     1.1 --- a/src/share/vm/prims/methodHandles.cpp	Wed Feb 15 17:39:29 2017 +0000
     1.2 +++ b/src/share/vm/prims/methodHandles.cpp	Fri Feb 24 06:48:48 2017 -0800
     1.3 @@ -173,7 +173,7 @@
     1.4    return NULL;
     1.5  }
     1.6  
     1.7 -oop MethodHandles::init_method_MemberName(Handle mname, CallInfo& info) {
     1.8 +oop MethodHandles::init_method_MemberName(Handle mname, CallInfo& info, bool intern) {
     1.9    assert(info.resolved_appendix().is_null(), "only normal methods here");
    1.10    methodHandle m = info.resolved_method();
    1.11    KlassHandle m_klass = m->method_holder();
    1.12 @@ -270,13 +270,7 @@
    1.13    // If relevant, the vtable or itable value is stored as vmindex.
    1.14    // This is done eagerly, since it is readily available without
    1.15    // constructing any new objects.
    1.16 -  // TO DO: maybe intern mname_oop
    1.17 -  if (m->method_holder()->add_member_name(mname)) {
    1.18 -    return mname();
    1.19 -  } else {
    1.20 -    // Redefinition caused this to fail.  Return NULL (and an exception?)
    1.21 -    return NULL;
    1.22 -  }
    1.23 +  return m->method_holder()->add_member_name(mname, intern);
    1.24  }
    1.25  
    1.26  oop MethodHandles::init_field_MemberName(Handle mname, fieldDescriptor& fd, bool is_setter) {
    1.27 @@ -917,7 +911,9 @@
    1.28          if (!java_lang_invoke_MemberName::is_instance(result()))
    1.29            return -99;  // caller bug!
    1.30          CallInfo info(m);
    1.31 -        oop saved = MethodHandles::init_method_MemberName(result, info);
    1.32 +        // Since this is going through the methods to create MemberNames, don't search
    1.33 +        // for matching methods already in the table
    1.34 +        oop saved = MethodHandles::init_method_MemberName(result, info, /*intern*/false);
    1.35          if (saved != result())
    1.36            results->obj_at_put(rfill-1, saved);  // show saved instance to user
    1.37        } else if (++overflow >= overflow_limit) {
    1.38 @@ -949,9 +945,34 @@
    1.39    }
    1.40  }
    1.41  
    1.42 -void MemberNameTable::add_member_name(jweak mem_name_wref) {
    1.43 +oop MemberNameTable::add_member_name(jweak mem_name_wref) {
    1.44    assert_locked_or_safepoint(MemberNameTable_lock);
    1.45    this->push(mem_name_wref);
    1.46 +  return JNIHandles::resolve(mem_name_wref);
    1.47 +}
    1.48 +
    1.49 +oop MemberNameTable::find_or_add_member_name(jweak mem_name_wref) {
    1.50 +  assert_locked_or_safepoint(MemberNameTable_lock);
    1.51 +  oop new_mem_name = JNIHandles::resolve(mem_name_wref);
    1.52 +
    1.53 +  // Find matching member name in the list.
    1.54 +  // This is linear because these are short lists.
    1.55 +  int len = this->length();
    1.56 +  int new_index = len;
    1.57 +  for (int idx = 0; idx < len; idx++) {
    1.58 +    oop mname = JNIHandles::resolve(this->at(idx));
    1.59 +    if (mname == NULL) {
    1.60 +      new_index = idx;
    1.61 +      continue;
    1.62 +    }
    1.63 +    if (java_lang_invoke_MemberName::equals(new_mem_name, mname)) {
    1.64 +      JNIHandles::destroy_weak_global(mem_name_wref);
    1.65 +      return mname;
    1.66 +    }
    1.67 +  }
    1.68 +  // Not found, push the new one, or reuse empty slot
    1.69 +  this->at_put_grow(new_index, mem_name_wref);
    1.70 +  return new_mem_name;
    1.71  }
    1.72  
    1.73  #if INCLUDE_JVMTI

mercurial