src/share/vm/prims/methodHandles.cpp

changeset 7391
fe34c5ab0b35
parent 6680
78bbf4d43a14
child 7535
7ae4e26cb1e0
child 7795
157895117ad5
     1.1 --- a/src/share/vm/prims/methodHandles.cpp	Thu Nov 20 11:06:26 2014 +0100
     1.2 +++ b/src/share/vm/prims/methodHandles.cpp	Wed Nov 19 13:02:11 2014 -0500
     1.3 @@ -29,7 +29,6 @@
     1.4  #include "interpreter/oopMapCache.hpp"
     1.5  #include "memory/allocation.inline.hpp"
     1.6  #include "memory/oopFactory.hpp"
     1.7 -#include "prims/jvmtiRedefineClassesTrace.hpp"
     1.8  #include "prims/methodHandles.hpp"
     1.9  #include "runtime/compilationPolicy.hpp"
    1.10  #include "runtime/javaCalls.hpp"
    1.11 @@ -271,9 +270,12 @@
    1.12    // This is done eagerly, since it is readily available without
    1.13    // constructing any new objects.
    1.14    // TO DO: maybe intern mname_oop
    1.15 -  m->method_holder()->add_member_name(m->method_idnum(), mname);
    1.16 -
    1.17 -  return mname();
    1.18 +  if (m->method_holder()->add_member_name(mname)) {
    1.19 +    return mname();
    1.20 +  } else {
    1.21 +    // Redefinition caused this to fail.  Return NULL (and an exception?)
    1.22 +    return NULL;
    1.23 +  }
    1.24  }
    1.25  
    1.26  oop MethodHandles::init_field_MemberName(Handle mname, fieldDescriptor& fd, bool is_setter) {
    1.27 @@ -946,63 +948,27 @@
    1.28    }
    1.29  }
    1.30  
    1.31 -void MemberNameTable::add_member_name(int index, jweak mem_name_wref) {
    1.32 +void MemberNameTable::add_member_name(jweak mem_name_wref) {
    1.33    assert_locked_or_safepoint(MemberNameTable_lock);
    1.34 -  this->at_put_grow(index, mem_name_wref);
    1.35 -}
    1.36 -
    1.37 -// Return a member name oop or NULL.
    1.38 -oop MemberNameTable::get_member_name(int index) {
    1.39 -  assert_locked_or_safepoint(MemberNameTable_lock);
    1.40 -
    1.41 -  jweak ref = this->at(index);
    1.42 -  oop mem_name = JNIHandles::resolve(ref);
    1.43 -  return mem_name;
    1.44 +  this->push(mem_name_wref);
    1.45  }
    1.46  
    1.47  #if INCLUDE_JVMTI
    1.48 -oop MemberNameTable::find_member_name_by_method(Method* old_method) {
    1.49 -  assert_locked_or_safepoint(MemberNameTable_lock);
    1.50 -  oop found = NULL;
    1.51 -  int len = this->length();
    1.52 -
    1.53 -  for (int idx = 0; idx < len; idx++) {
    1.54 -    oop mem_name = JNIHandles::resolve(this->at(idx));
    1.55 -    if (mem_name == NULL) {
    1.56 -      continue;
    1.57 -    }
    1.58 -    Method* method = (Method*)java_lang_invoke_MemberName::vmtarget(mem_name);
    1.59 -    if (method == old_method) {
    1.60 -      found = mem_name;
    1.61 -      break;
    1.62 -    }
    1.63 -  }
    1.64 -  return found;
    1.65 -}
    1.66 -
    1.67 -// It is called at safepoint only
    1.68 +// It is called at safepoint only for RedefineClasses
    1.69  void MemberNameTable::adjust_method_entries(Method** old_methods, Method** new_methods,
    1.70                                              int methods_length, bool *trace_name_printed) {
    1.71    assert(SafepointSynchronize::is_at_safepoint(), "only called at safepoint");
    1.72 -  // search the MemberNameTable for uses of either obsolete or EMCP methods
    1.73 +  // For each redefined method
    1.74    for (int j = 0; j < methods_length; j++) {
    1.75      Method* old_method = old_methods[j];
    1.76      Method* new_method = new_methods[j];
    1.77 -    oop mem_name = find_member_name_by_method(old_method);
    1.78 -    if (mem_name != NULL) {
    1.79 -      java_lang_invoke_MemberName::adjust_vmtarget(mem_name, new_method);
    1.80  
    1.81 -      if (RC_TRACE_IN_RANGE(0x00100000, 0x00400000)) {
    1.82 -        if (!(*trace_name_printed)) {
    1.83 -          // RC_TRACE_MESG macro has an embedded ResourceMark
    1.84 -          RC_TRACE_MESG(("adjust: name=%s",
    1.85 -                         old_method->method_holder()->external_name()));
    1.86 -          *trace_name_printed = true;
    1.87 -        }
    1.88 -        // RC_TRACE macro has an embedded ResourceMark
    1.89 -        RC_TRACE(0x00400000, ("MemberName method update: %s(%s)",
    1.90 -                              new_method->name()->as_C_string(),
    1.91 -                              new_method->signature()->as_C_string()));
    1.92 +    // search the MemberNameTable for uses of either obsolete or EMCP methods
    1.93 +    for (int idx = 0; idx < length(); idx++) {
    1.94 +      oop mem_name = JNIHandles::resolve(this->at(idx));
    1.95 +      if (mem_name != NULL) {
    1.96 +        java_lang_invoke_MemberName::adjust_vmtarget(mem_name, old_method, new_method,
    1.97 +                                                     trace_name_printed);
    1.98        }
    1.99      }
   1.100    }

mercurial