Merge

Fri, 26 Apr 2013 14:50:23 -0400

author
bharadwaj
date
Fri, 26 Apr 2013 14:50:23 -0400
changeset 5035
fd49109d0d88
parent 5033
93b8272814cf
parent 5034
0b55a78c6be5
child 5037
62b683108582

Merge

     1.1 --- a/.hgtags	Fri Apr 26 08:33:39 2013 -0700
     1.2 +++ b/.hgtags	Fri Apr 26 14:50:23 2013 -0400
     1.3 @@ -334,4 +334,6 @@
     1.4  09b0d3e9ba6cdf7da07d4010d2d1df14596f6864 hs25-b27
     1.5  6d88a566d369f6a1f86912cad7d0912686b2fda1 hs25-b28
     1.6  86db4847f195c0ecceea646431f1ff22d56282e8 jdk8-b86
     1.7 +d4c2667846607042370760e23f64c3ab9350e60d jdk8-b87
     1.8  01d5f04e64dc2d64625b2db2056f5ed4de918a45 hs25-b29
     1.9 +c4af77d2045476c56fbf3f914b336bb1b7cd18af hs25-b30
     2.1 --- a/make/hotspot_version	Fri Apr 26 08:33:39 2013 -0700
     2.2 +++ b/make/hotspot_version	Fri Apr 26 14:50:23 2013 -0400
     2.3 @@ -35,7 +35,7 @@
     2.4  
     2.5  HS_MAJOR_VER=25
     2.6  HS_MINOR_VER=0
     2.7 -HS_BUILD_NUMBER=30
     2.8 +HS_BUILD_NUMBER=31
     2.9  
    2.10  JDK_MAJOR_VER=1
    2.11  JDK_MINOR_VER=8
     3.1 --- a/src/cpu/sparc/vm/interp_masm_sparc.cpp	Fri Apr 26 08:33:39 2013 -0700
     3.2 +++ b/src/cpu/sparc/vm/interp_masm_sparc.cpp	Fri Apr 26 14:50:23 2013 -0400
     3.3 @@ -2097,7 +2097,8 @@
     3.4    call_VM(noreg, CAST_FROM_FN_PTR(address,
     3.5            InterpreterRuntime::build_method_counters), method);
     3.6    ld_ptr(method_counters, Rcounters);
     3.7 -  br_null_short(Rcounters, Assembler::pn, skip); // No MethodCounters, OutOfMemory
     3.8 +  br_null(Rcounters, false, Assembler::pn, skip); // No MethodCounters, OutOfMemory
     3.9 +  delayed()->nop();
    3.10    bind(has_counters);
    3.11  }
    3.12  
     4.1 --- a/src/share/vm/classfile/classFileParser.cpp	Fri Apr 26 08:33:39 2013 -0700
     4.2 +++ b/src/share/vm/classfile/classFileParser.cpp	Fri Apr 26 14:50:23 2013 -0400
     4.3 @@ -436,14 +436,19 @@
     4.4                ref_index, CHECK_(nullHandle));
     4.5              break;
     4.6            case JVM_REF_invokeVirtual:
     4.7 -          case JVM_REF_invokeStatic:
     4.8 -          case JVM_REF_invokeSpecial:
     4.9            case JVM_REF_newInvokeSpecial:
    4.10              check_property(
    4.11                tag.is_method(),
    4.12                "Invalid constant pool index %u in class file %s (not a method)",
    4.13                ref_index, CHECK_(nullHandle));
    4.14              break;
    4.15 +          case JVM_REF_invokeStatic:
    4.16 +          case JVM_REF_invokeSpecial:
    4.17 +            check_property(
    4.18 +               tag.is_method() || tag.is_interface_method(),
    4.19 +               "Invalid constant pool index %u in class file %s (not a method)",
    4.20 +               ref_index, CHECK_(nullHandle));
    4.21 +             break;
    4.22            case JVM_REF_invokeInterface:
    4.23              check_property(
    4.24                tag.is_interface_method(),
    4.25 @@ -3837,7 +3842,7 @@
    4.26      }
    4.27  
    4.28      if (TraceClassLoadingPreorder) {
    4.29 -      tty->print("[Loading %s", name->as_klass_external_name());
    4.30 +      tty->print("[Loading %s", (name != NULL) ? name->as_klass_external_name() : "NoName");
    4.31        if (cfs->source() != NULL) tty->print(" from %s", cfs->source());
    4.32        tty->print_cr("]");
    4.33      }
     5.1 --- a/src/share/vm/classfile/genericSignatures.cpp	Fri Apr 26 08:33:39 2013 -0700
     5.2 +++ b/src/share/vm/classfile/genericSignatures.cpp	Fri Apr 26 14:50:23 2013 -0400
     5.3 @@ -268,8 +268,15 @@
     5.4      Klass* outer = SystemDictionary::find(
     5.5          outer_name, class_loader, protection_domain, CHECK_NULL);
     5.6      if (outer == NULL && !THREAD->is_Compiler_thread()) {
     5.7 -      outer = SystemDictionary::resolve_super_or_fail(original_name,
     5.8 -          outer_name, class_loader, protection_domain, false, CHECK_NULL);
     5.9 +      if (outer_name == ik->super()->name()) {
    5.10 +        outer = SystemDictionary::resolve_super_or_fail(original_name, outer_name,
    5.11 +                                                        class_loader, protection_domain,
    5.12 +                                                        false, CHECK_NULL);
    5.13 +      }
    5.14 +      else {
    5.15 +        outer = SystemDictionary::resolve_or_fail(outer_name, class_loader,
    5.16 +                                                  protection_domain, false, CHECK_NULL);
    5.17 +      }
    5.18      }
    5.19  
    5.20      InstanceKlass* outer_ik;
     6.1 --- a/src/share/vm/classfile/javaClasses.cpp	Fri Apr 26 08:33:39 2013 -0700
     6.2 +++ b/src/share/vm/classfile/javaClasses.cpp	Fri Apr 26 14:50:23 2013 -0400
     6.3 @@ -2625,6 +2625,15 @@
     6.4    return (Metadata*)mname->address_field(_vmtarget_offset);
     6.5  }
     6.6  
     6.7 +#if INCLUDE_JVMTI
     6.8 +// Can be executed on VM thread only
     6.9 +void java_lang_invoke_MemberName::adjust_vmtarget(oop mname, Metadata* ref) {
    6.10 +  assert((is_instance(mname) && (flags(mname) & (MN_IS_METHOD | MN_IS_CONSTRUCTOR)) > 0), "wrong type");
    6.11 +  assert(Thread::current()->is_VM_thread(), "not VM thread");
    6.12 +  mname->address_field_put(_vmtarget_offset, (address)ref);
    6.13 +}
    6.14 +#endif // INCLUDE_JVMTI
    6.15 +
    6.16  void java_lang_invoke_MemberName::set_vmtarget(oop mname, Metadata* ref) {
    6.17    assert(is_instance(mname), "wrong type");
    6.18    // check the type of the vmtarget
     7.1 --- a/src/share/vm/classfile/javaClasses.hpp	Fri Apr 26 08:33:39 2013 -0700
     7.2 +++ b/src/share/vm/classfile/javaClasses.hpp	Fri Apr 26 14:50:23 2013 -0400
     7.3 @@ -1036,6 +1036,9 @@
     7.4  
     7.5    static Metadata*      vmtarget(oop mname);
     7.6    static void       set_vmtarget(oop mname, Metadata* target);
     7.7 +#if INCLUDE_JVMTI
     7.8 +  static void       adjust_vmtarget(oop mname, Metadata* target);
     7.9 +#endif // INCLUDE_JVMTI
    7.10  
    7.11    static intptr_t       vmindex(oop mname);
    7.12    static void       set_vmindex(oop mname, intptr_t index);
     8.1 --- a/src/share/vm/interpreter/linkResolver.cpp	Fri Apr 26 08:33:39 2013 -0700
     8.2 +++ b/src/share/vm/interpreter/linkResolver.cpp	Fri Apr 26 14:50:23 2013 -0400
     8.3 @@ -1014,13 +1014,28 @@
     8.4                                                        resolved_method->name(),
     8.5                                                        resolved_method->signature()));
     8.6    }
     8.7 -  // check if public
     8.8 -  if (!sel_method->is_public()) {
     8.9 -    ResourceMark rm(THREAD);
    8.10 -    THROW_MSG(vmSymbols::java_lang_IllegalAccessError(),
    8.11 -              Method::name_and_sig_as_C_string(recv_klass(),
    8.12 -                                                      sel_method->name(),
    8.13 -                                                      sel_method->signature()));
    8.14 +  // check access
    8.15 +  if (sel_method->method_holder()->is_interface()) {
    8.16 +    // Method holder is an interface. Throw Illegal Access Error if sel_method
    8.17 +    // is neither public nor private.
    8.18 +    if (!(sel_method->is_public() || sel_method->is_private())) {
    8.19 +      ResourceMark rm(THREAD);
    8.20 +      THROW_MSG(vmSymbols::java_lang_IllegalAccessError(),
    8.21 +                Method::name_and_sig_as_C_string(recv_klass(),
    8.22 +                                                 sel_method->name(),
    8.23 +                                                 sel_method->signature()));
    8.24 +    }
    8.25 +  }
    8.26 +  else {
    8.27 +    // Method holder is a class. Throw Illegal Access Error if sel_method
    8.28 +    // is not public.
    8.29 +    if (!sel_method->is_public()) {
    8.30 +      ResourceMark rm(THREAD);
    8.31 +      THROW_MSG(vmSymbols::java_lang_IllegalAccessError(),
    8.32 +                Method::name_and_sig_as_C_string(recv_klass(),
    8.33 +                                                 sel_method->name(),
    8.34 +                                                 sel_method->signature()));
    8.35 +    }
    8.36    }
    8.37    // check if abstract
    8.38    if (check_null_and_abstract && sel_method->is_abstract()) {
     9.1 --- a/src/share/vm/memory/allocation.hpp	Fri Apr 26 08:33:39 2013 -0700
     9.2 +++ b/src/share/vm/memory/allocation.hpp	Fri Apr 26 14:50:23 2013 -0400
     9.3 @@ -1,5 +1,5 @@
     9.4  /*
     9.5 - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
     9.6 + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
     9.7   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     9.8   *
     9.9   * This code is free software; you can redistribute it and/or modify it
    10.1 --- a/src/share/vm/oops/instanceKlass.cpp	Fri Apr 26 08:33:39 2013 -0700
    10.2 +++ b/src/share/vm/oops/instanceKlass.cpp	Fri Apr 26 14:50:23 2013 -0400
    10.3 @@ -2329,6 +2329,12 @@
    10.4      FreeHeap(jmeths);
    10.5    }
    10.6  
    10.7 +  MemberNameTable* mnt = member_names();
    10.8 +  if (mnt != NULL) {
    10.9 +    delete mnt;
   10.10 +    set_member_names(NULL);
   10.11 +  }
   10.12 +
   10.13    int* indices = methods_cached_itable_indices_acquire();
   10.14    if (indices != (int*)NULL) {
   10.15      release_set_methods_cached_itable_indices(NULL);
   10.16 @@ -2757,6 +2763,17 @@
   10.17    return NULL;
   10.18  }
   10.19  
   10.20 +void InstanceKlass::add_member_name(Handle mem_name) {
   10.21 +  jweak mem_name_wref = JNIHandles::make_weak_global(mem_name);
   10.22 +  MutexLocker ml(MemberNameTable_lock);
   10.23 +  DEBUG_ONLY(No_Safepoint_Verifier nsv);
   10.24 +
   10.25 +  if (_member_names == NULL) {
   10.26 +    _member_names = new (ResourceObj::C_HEAP, mtClass) MemberNameTable();
   10.27 +  }
   10.28 +  _member_names->add_member_name(mem_name_wref);
   10.29 +}
   10.30 +
   10.31  // -----------------------------------------------------------------------------------------------------
   10.32  // Printing
   10.33  
    11.1 --- a/src/share/vm/oops/instanceKlass.hpp	Fri Apr 26 08:33:39 2013 -0700
    11.2 +++ b/src/share/vm/oops/instanceKlass.hpp	Fri Apr 26 14:50:23 2013 -0400
    11.3 @@ -90,6 +90,7 @@
    11.4  class nmethodBucket;
    11.5  class PreviousVersionNode;
    11.6  class JvmtiCachedClassFieldMap;
    11.7 +class MemberNameTable;
    11.8  
    11.9  // This is used in iterators below.
   11.10  class FieldClosure: public StackObj {
   11.11 @@ -246,6 +247,7 @@
   11.12    int             _vtable_len;           // length of Java vtable (in words)
   11.13    int             _itable_len;           // length of Java itable (in words)
   11.14    OopMapCache*    volatile _oop_map_cache;   // OopMapCache for all methods in the klass (allocated lazily)
   11.15 +  MemberNameTable* _member_names;        // Member names
   11.16    JNIid*          _jni_ids;              // First JNI identifier for static fields in this class
   11.17    jmethodID*      _methods_jmethod_ids;  // jmethodIDs corresponding to method_idnum, or NULL if none
   11.18    int*            _methods_cached_itable_indices;  // itable_index cache for JNI invoke corresponding to methods idnum, or NULL
   11.19 @@ -1028,6 +1030,11 @@
   11.20    // jvm support
   11.21    jint compute_modifier_flags(TRAPS) const;
   11.22  
   11.23 +  // JSR-292 support
   11.24 +  MemberNameTable* member_names() { return _member_names; }
   11.25 +  void set_member_names(MemberNameTable* member_names) { _member_names = member_names; }
   11.26 +  void add_member_name(Handle member_name);
   11.27 +
   11.28  public:
   11.29    // JVMTI support
   11.30    jint jvmti_class_status() const;
    12.1 --- a/src/share/vm/prims/jvmtiRedefineClasses.cpp	Fri Apr 26 08:33:39 2013 -0700
    12.2 +++ b/src/share/vm/prims/jvmtiRedefineClasses.cpp	Fri Apr 26 14:50:23 2013 -0400
    12.3 @@ -3284,6 +3284,16 @@
    12.4    // that reference methods of the evolved class.
    12.5    SystemDictionary::classes_do(adjust_cpool_cache_and_vtable, THREAD);
    12.6  
    12.7 +  // JSR-292 support
    12.8 +  MemberNameTable* mnt = the_class->member_names();
    12.9 +  if (mnt != NULL) {
   12.10 +    bool trace_name_printed = false;
   12.11 +    mnt->adjust_method_entries(_matching_old_methods,
   12.12 +                               _matching_new_methods,
   12.13 +                               _matching_methods_length,
   12.14 +                               &trace_name_printed);
   12.15 +  }
   12.16 +
   12.17    // Fix Resolution Error table also to remove old constant pools
   12.18    SystemDictionary::delete_resolution_error(old_constants);
   12.19  
    13.1 --- a/src/share/vm/prims/methodHandles.cpp	Fri Apr 26 08:33:39 2013 -0700
    13.2 +++ b/src/share/vm/prims/methodHandles.cpp	Fri Apr 26 14:50:23 2013 -0400
    13.3 @@ -29,6 +29,7 @@
    13.4  #include "interpreter/oopMapCache.hpp"
    13.5  #include "memory/allocation.inline.hpp"
    13.6  #include "memory/oopFactory.hpp"
    13.7 +#include "prims/jvmtiRedefineClassesTrace.hpp"
    13.8  #include "prims/methodHandles.hpp"
    13.9  #include "runtime/compilationPolicy.hpp"
   13.10  #include "runtime/javaCalls.hpp"
   13.11 @@ -124,7 +125,9 @@
   13.12    return Handle(THREAD, k->allocate_instance(THREAD));
   13.13  }
   13.14  
   13.15 -oop MethodHandles::init_MemberName(oop mname_oop, oop target_oop) {
   13.16 +oop MethodHandles::init_MemberName(Handle mname, Handle target) {
   13.17 +  Thread* thread = Thread::current();
   13.18 +  oop target_oop = target();
   13.19    Klass* target_klass = target_oop->klass();
   13.20    if (target_klass == SystemDictionary::reflect_Field_klass()) {
   13.21      oop clazz = java_lang_reflect_Field::clazz(target_oop); // fd.field_holder()
   13.22 @@ -132,24 +135,24 @@
   13.23      int mods  = java_lang_reflect_Field::modifiers(target_oop);
   13.24      oop type  = java_lang_reflect_Field::type(target_oop);
   13.25      oop name  = java_lang_reflect_Field::name(target_oop);
   13.26 -    Klass* k = java_lang_Class::as_Klass(clazz);
   13.27 -    intptr_t offset = InstanceKlass::cast(k)->field_offset(slot);
   13.28 -    return init_field_MemberName(mname_oop, k, accessFlags_from(mods), type, name, offset);
   13.29 +    KlassHandle k(thread, java_lang_Class::as_Klass(clazz));
   13.30 +    intptr_t offset = InstanceKlass::cast(k())->field_offset(slot);
   13.31 +    return init_field_MemberName(mname, k, accessFlags_from(mods), type, name, offset);
   13.32    } else if (target_klass == SystemDictionary::reflect_Method_klass()) {
   13.33      oop clazz  = java_lang_reflect_Method::clazz(target_oop);
   13.34      int slot   = java_lang_reflect_Method::slot(target_oop);
   13.35 -    Klass* k = java_lang_Class::as_Klass(clazz);
   13.36 -    if (k != NULL && k->oop_is_instance()) {
   13.37 -      Method* m = InstanceKlass::cast(k)->method_with_idnum(slot);
   13.38 -      return init_method_MemberName(mname_oop, m, true, k);
   13.39 +    KlassHandle k(thread, java_lang_Class::as_Klass(clazz));
   13.40 +    if (!k.is_null() && k->oop_is_instance()) {
   13.41 +      Method* m = InstanceKlass::cast(k())->method_with_idnum(slot);
   13.42 +      return init_method_MemberName(mname, m, true, k);
   13.43      }
   13.44    } else if (target_klass == SystemDictionary::reflect_Constructor_klass()) {
   13.45      oop clazz  = java_lang_reflect_Constructor::clazz(target_oop);
   13.46      int slot   = java_lang_reflect_Constructor::slot(target_oop);
   13.47 -    Klass* k = java_lang_Class::as_Klass(clazz);
   13.48 -    if (k != NULL && k->oop_is_instance()) {
   13.49 -      Method* m = InstanceKlass::cast(k)->method_with_idnum(slot);
   13.50 -      return init_method_MemberName(mname_oop, m, false, k);
   13.51 +    KlassHandle k(thread, java_lang_Class::as_Klass(clazz));
   13.52 +    if (!k.is_null() && k->oop_is_instance()) {
   13.53 +      Method* m = InstanceKlass::cast(k())->method_with_idnum(slot);
   13.54 +      return init_method_MemberName(mname, m, false, k);
   13.55      }
   13.56    } else if (target_klass == SystemDictionary::MemberName_klass()) {
   13.57      // Note: This only works if the MemberName has already been resolved.
   13.58 @@ -157,17 +160,18 @@
   13.59      int flags        = java_lang_invoke_MemberName::flags(target_oop);
   13.60      Metadata* vmtarget=java_lang_invoke_MemberName::vmtarget(target_oop);
   13.61      intptr_t vmindex = java_lang_invoke_MemberName::vmindex(target_oop);
   13.62 -    Klass* k         = java_lang_Class::as_Klass(clazz);
   13.63 +    KlassHandle k(thread, java_lang_Class::as_Klass(clazz));
   13.64      int ref_kind     = (flags >> REFERENCE_KIND_SHIFT) & REFERENCE_KIND_MASK;
   13.65      if (vmtarget == NULL)  return NULL;  // not resolved
   13.66      if ((flags & IS_FIELD) != 0) {
   13.67        assert(vmtarget->is_klass(), "field vmtarget is Klass*");
   13.68        int basic_mods = (ref_kind_is_static(ref_kind) ? JVM_ACC_STATIC : 0);
   13.69        // FIXME:  how does k (receiver_limit) contribute?
   13.70 -      return init_field_MemberName(mname_oop, (Klass*)vmtarget, accessFlags_from(basic_mods), NULL, NULL, vmindex);
   13.71 +      KlassHandle k_vmtarget(thread, (Klass*)vmtarget);
   13.72 +      return init_field_MemberName(mname, k_vmtarget, accessFlags_from(basic_mods), NULL, NULL, vmindex);
   13.73      } else if ((flags & (IS_METHOD | IS_CONSTRUCTOR)) != 0) {
   13.74        assert(vmtarget->is_method(), "method or constructor vmtarget is Method*");
   13.75 -      return init_method_MemberName(mname_oop, (Method*)vmtarget, ref_kind_does_dispatch(ref_kind), k);
   13.76 +      return init_method_MemberName(mname, (Method*)vmtarget, ref_kind_does_dispatch(ref_kind), k);
   13.77      } else {
   13.78        return NULL;
   13.79      }
   13.80 @@ -175,8 +179,9 @@
   13.81    return NULL;
   13.82  }
   13.83  
   13.84 -oop MethodHandles::init_method_MemberName(oop mname_oop, Method* m, bool do_dispatch,
   13.85 -                                          Klass* receiver_limit) {
   13.86 +oop MethodHandles::init_method_MemberName(Handle mname, Method* m, bool do_dispatch,
   13.87 +                                          KlassHandle receiver_limit_h) {
   13.88 +  Klass* receiver_limit = receiver_limit_h();
   13.89    AccessFlags mods = m->access_flags();
   13.90    int flags = (jushort)( mods.as_short() & JVM_RECOGNIZED_METHOD_MODIFIERS );
   13.91    int vmindex = Method::nonvirtual_vtable_index; // implies never any dispatch
   13.92 @@ -187,6 +192,10 @@
   13.93      flags |= IS_CONSTRUCTOR | (JVM_REF_invokeSpecial << REFERENCE_KIND_SHIFT);
   13.94    } else if (mods.is_static()) {
   13.95      flags |= IS_METHOD | (JVM_REF_invokeStatic << REFERENCE_KIND_SHIFT);
   13.96 +     // Get vindex from itable if method holder is an interface.
   13.97 +     if (m->method_holder()->is_interface()) {
   13.98 +       vmindex = klassItable::compute_itable_index(m);
   13.99 +     }
  13.100    } else if (receiver_limit != mklass &&
  13.101               !receiver_limit->is_subtype_of(mklass)) {
  13.102      return NULL;  // bad receiver limit
  13.103 @@ -213,6 +222,7 @@
  13.104      flags |= CALLER_SENSITIVE;
  13.105    }
  13.106  
  13.107 +  oop mname_oop = mname();
  13.108    java_lang_invoke_MemberName::set_flags(   mname_oop, flags);
  13.109    java_lang_invoke_MemberName::set_vmtarget(mname_oop, m);
  13.110    java_lang_invoke_MemberName::set_vmindex( mname_oop, vmindex);   // vtable/itable index
  13.111 @@ -225,10 +235,11 @@
  13.112    // This is done eagerly, since it is readily available without
  13.113    // constructing any new objects.
  13.114    // TO DO: maybe intern mname_oop
  13.115 -  return mname_oop;
  13.116 +  m->method_holder()->add_member_name(mname);
  13.117 +  return mname();
  13.118  }
  13.119  
  13.120 -Handle MethodHandles::init_method_MemberName(oop mname_oop, CallInfo& info, TRAPS) {
  13.121 +Handle MethodHandles::init_method_MemberName(Handle mname, CallInfo& info, TRAPS) {
  13.122    Handle empty;
  13.123    if (info.resolved_appendix().not_null()) {
  13.124      // The resolved MemberName must not be accompanied by an appendix argument,
  13.125 @@ -248,19 +259,20 @@
  13.126    } else {
  13.127      vmindex = info.vtable_index();
  13.128    }
  13.129 -  oop res = init_method_MemberName(mname_oop, m(), (vmindex >= 0), defc());
  13.130 +  oop res = init_method_MemberName(mname, m(), (vmindex >= 0), defc());
  13.131    assert(res == NULL || (java_lang_invoke_MemberName::vmindex(res) == vmindex), "");
  13.132    return Handle(THREAD, res);
  13.133  }
  13.134  
  13.135 -oop MethodHandles::init_field_MemberName(oop mname_oop, Klass* field_holder,
  13.136 +oop MethodHandles::init_field_MemberName(Handle mname, KlassHandle field_holder,
  13.137                                           AccessFlags mods, oop type, oop name,
  13.138                                           intptr_t offset, bool is_setter) {
  13.139    int flags = (jushort)( mods.as_short() & JVM_RECOGNIZED_FIELD_MODIFIERS );
  13.140    flags |= IS_FIELD | ((mods.is_static() ? JVM_REF_getStatic : JVM_REF_getField) << REFERENCE_KIND_SHIFT);
  13.141    if (is_setter)  flags += ((JVM_REF_putField - JVM_REF_getField) << REFERENCE_KIND_SHIFT);
  13.142 -  Metadata* vmtarget = field_holder;
  13.143 +  Metadata* vmtarget = field_holder();
  13.144    int vmindex  = offset;  // determines the field uniquely when combined with static bit
  13.145 +  oop mname_oop = mname();
  13.146    java_lang_invoke_MemberName::set_flags(mname_oop,    flags);
  13.147    java_lang_invoke_MemberName::set_vmtarget(mname_oop, vmtarget);
  13.148    java_lang_invoke_MemberName::set_vmindex(mname_oop,  vmindex);
  13.149 @@ -277,10 +289,11 @@
  13.150    // Although the fieldDescriptor::_index would also identify the field,
  13.151    // we do not use it, because it is harder to decode.
  13.152    // TO DO: maybe intern mname_oop
  13.153 -  return mname_oop;
  13.154 +  InstanceKlass::cast(field_holder())->add_member_name(mname);
  13.155 +  return mname();
  13.156  }
  13.157  
  13.158 -Handle MethodHandles::init_field_MemberName(oop mname_oop, FieldAccessInfo& info, TRAPS) {
  13.159 +Handle MethodHandles::init_field_MemberName(Handle mname, FieldAccessInfo& info, TRAPS) {
  13.160    return Handle();
  13.161  #if 0 // FIXME
  13.162    KlassHandle field_holder = info.klass();
  13.163 @@ -679,7 +692,7 @@
  13.164            return empty;
  13.165          }
  13.166        }
  13.167 -      return init_method_MemberName(mname(), result, THREAD);
  13.168 +      return init_method_MemberName(mname, result, THREAD);
  13.169      }
  13.170    case IS_CONSTRUCTOR:
  13.171      {
  13.172 @@ -697,7 +710,7 @@
  13.173          }
  13.174        }
  13.175        assert(result.is_statically_bound(), "");
  13.176 -      return init_method_MemberName(mname(), result, THREAD);
  13.177 +      return init_method_MemberName(mname, result, THREAD);
  13.178      }
  13.179    case IS_FIELD:
  13.180      {
  13.181 @@ -710,7 +723,7 @@
  13.182        oop name = field_name_or_null(fd.name());
  13.183        bool is_setter = (ref_kind_is_valid(ref_kind) && ref_kind_is_setter(ref_kind));
  13.184        mname = Handle(THREAD,
  13.185 -                     init_field_MemberName(mname(), sel_klass(),
  13.186 +                     init_field_MemberName(mname, sel_klass,
  13.187                                             fd.access_flags(), type, name, fd.offset(), is_setter));
  13.188        return mname;
  13.189      }
  13.190 @@ -802,16 +815,15 @@
  13.191    THROW_MSG(vmSymbols::java_lang_InternalError(), "unrecognized MemberName format");
  13.192  }
  13.193  
  13.194 -int MethodHandles::find_MemberNames(Klass* k,
  13.195 +int MethodHandles::find_MemberNames(KlassHandle k,
  13.196                                      Symbol* name, Symbol* sig,
  13.197 -                                    int mflags, Klass* caller,
  13.198 -                                    int skip, objArrayOop results) {
  13.199 -  DEBUG_ONLY(No_Safepoint_Verifier nsv);
  13.200 -  // this code contains no safepoints!
  13.201 -
  13.202 +                                    int mflags, KlassHandle caller,
  13.203 +                                    int skip, objArrayHandle results) {
  13.204    // %%% take caller into account!
  13.205  
  13.206 -  if (k == NULL || !k->oop_is_instance())  return -1;
  13.207 +  Thread* thread = Thread::current();
  13.208 +
  13.209 +  if (k.is_null() || !k->oop_is_instance())  return -1;
  13.210  
  13.211    int rfill = 0, rlimit = results->length(), rskip = skip;
  13.212    // overflow measurement:
  13.213 @@ -839,7 +851,7 @@
  13.214    }
  13.215  
  13.216    if ((match_flags & IS_FIELD) != 0) {
  13.217 -    for (FieldStream st(k, local_only, !search_intfc); !st.eos(); st.next()) {
  13.218 +    for (FieldStream st(k(), local_only, !search_intfc); !st.eos(); st.next()) {
  13.219        if (name != NULL && st.name() != name)
  13.220            continue;
  13.221        if (sig != NULL && st.signature() != sig)
  13.222 @@ -848,15 +860,15 @@
  13.223        if (rskip > 0) {
  13.224          --rskip;
  13.225        } else if (rfill < rlimit) {
  13.226 -        oop result = results->obj_at(rfill++);
  13.227 -        if (!java_lang_invoke_MemberName::is_instance(result))
  13.228 +        Handle result(thread, results->obj_at(rfill++));
  13.229 +        if (!java_lang_invoke_MemberName::is_instance(result()))
  13.230            return -99;  // caller bug!
  13.231          oop type = field_signature_type_or_null(st.signature());
  13.232          oop name = field_name_or_null(st.name());
  13.233 -        oop saved = MethodHandles::init_field_MemberName(result, st.klass()(),
  13.234 +        oop saved = MethodHandles::init_field_MemberName(result, st.klass(),
  13.235                                                           st.access_flags(), type, name,
  13.236                                                           st.offset());
  13.237 -        if (saved != result)
  13.238 +        if (saved != result())
  13.239            results->obj_at_put(rfill-1, saved);  // show saved instance to user
  13.240        } else if (++overflow >= overflow_limit) {
  13.241          match_flags = 0; break; // got tired of looking at overflow
  13.242 @@ -889,7 +901,7 @@
  13.243      } else {
  13.244        // caller will accept either sort; no need to adjust name
  13.245      }
  13.246 -    for (MethodStream st(k, local_only, !search_intfc); !st.eos(); st.next()) {
  13.247 +    for (MethodStream st(k(), local_only, !search_intfc); !st.eos(); st.next()) {
  13.248        Method* m = st.method();
  13.249        Symbol* m_name = m->name();
  13.250        if (m_name == clinit_name)
  13.251 @@ -902,11 +914,11 @@
  13.252        if (rskip > 0) {
  13.253          --rskip;
  13.254        } else if (rfill < rlimit) {
  13.255 -        oop result = results->obj_at(rfill++);
  13.256 -        if (!java_lang_invoke_MemberName::is_instance(result))
  13.257 +        Handle result(thread, results->obj_at(rfill++));
  13.258 +        if (!java_lang_invoke_MemberName::is_instance(result()))
  13.259            return -99;  // caller bug!
  13.260          oop saved = MethodHandles::init_method_MemberName(result, m, true, NULL);
  13.261 -        if (saved != result)
  13.262 +        if (saved != result())
  13.263            results->obj_at_put(rfill-1, saved);  // show saved instance to user
  13.264        } else if (++overflow >= overflow_limit) {
  13.265          match_flags = 0; break; // got tired of looking at overflow
  13.266 @@ -917,6 +929,99 @@
  13.267    // return number of elements we at leasted wanted to initialize
  13.268    return rfill + overflow;
  13.269  }
  13.270 +
  13.271 +//------------------------------------------------------------------------------
  13.272 +// MemberNameTable
  13.273 +//
  13.274 +
  13.275 +MemberNameTable::MemberNameTable() : GrowableArray<jweak>(10, true) {
  13.276 +  assert_locked_or_safepoint(MemberNameTable_lock);
  13.277 +}
  13.278 +
  13.279 +MemberNameTable::~MemberNameTable() {
  13.280 +  assert_locked_or_safepoint(MemberNameTable_lock);
  13.281 +  int len = this->length();
  13.282 +
  13.283 +  for (int idx = 0; idx < len; idx++) {
  13.284 +    jweak ref = this->at(idx);
  13.285 +    JNIHandles::destroy_weak_global(ref);
  13.286 +  }
  13.287 +}
  13.288 +
  13.289 +// Return entry index if found, return -1 otherwise.
  13.290 +int MemberNameTable::find_member_name(oop mem_name) {
  13.291 +  assert_locked_or_safepoint(MemberNameTable_lock);
  13.292 +  int len = this->length();
  13.293 +
  13.294 +  for (int idx = 0; idx < len; idx++) {
  13.295 +    jweak ref = this->at(idx);
  13.296 +    oop entry = JNIHandles::resolve(ref);
  13.297 +    if (entry == mem_name) {
  13.298 +      return idx;
  13.299 +    }
  13.300 +  }
  13.301 +  return -1;
  13.302 +}
  13.303 +
  13.304 +void MemberNameTable::add_member_name(jweak mem_name_wref) {
  13.305 +  assert_locked_or_safepoint(MemberNameTable_lock);
  13.306 +  oop mem_name = JNIHandles::resolve(mem_name_wref);
  13.307 +
  13.308 +  // Each member name may appear just once: add only if not found
  13.309 +  if (find_member_name(mem_name) == -1) {
  13.310 +    this->append(mem_name_wref);
  13.311 +  }
  13.312 +}
  13.313 +
  13.314 +#if INCLUDE_JVMTI
  13.315 +oop MemberNameTable::find_member_name_by_method(Method* old_method) {
  13.316 +  assert_locked_or_safepoint(MemberNameTable_lock);
  13.317 +  oop found = NULL;
  13.318 +  int len = this->length();
  13.319 +
  13.320 +  for (int idx = 0; idx < len; idx++) {
  13.321 +    oop mem_name = JNIHandles::resolve(this->at(idx));
  13.322 +    if (mem_name == NULL) {
  13.323 +      continue;
  13.324 +    }
  13.325 +    Method* method = (Method*)java_lang_invoke_MemberName::vmtarget(mem_name);
  13.326 +    if (method == old_method) {
  13.327 +      found = mem_name;
  13.328 +      break;
  13.329 +    }
  13.330 +  }
  13.331 +  return found;
  13.332 +}
  13.333 +
  13.334 +// It is called at safepoint only
  13.335 +void MemberNameTable::adjust_method_entries(Method** old_methods, Method** new_methods,
  13.336 +                                            int methods_length, bool *trace_name_printed) {
  13.337 +  assert(SafepointSynchronize::is_at_safepoint(), "only called at safepoint");
  13.338 +  // search the MemberNameTable for uses of either obsolete or EMCP methods
  13.339 +  for (int j = 0; j < methods_length; j++) {
  13.340 +    Method* old_method = old_methods[j];
  13.341 +    Method* new_method = new_methods[j];
  13.342 +    oop mem_name = find_member_name_by_method(old_method);
  13.343 +    if (mem_name != NULL) {
  13.344 +      java_lang_invoke_MemberName::adjust_vmtarget(mem_name, new_method);
  13.345 +
  13.346 +      if (RC_TRACE_IN_RANGE(0x00100000, 0x00400000)) {
  13.347 +        if (!(*trace_name_printed)) {
  13.348 +          // RC_TRACE_MESG macro has an embedded ResourceMark
  13.349 +          RC_TRACE_MESG(("adjust: name=%s",
  13.350 +                         old_method->method_holder()->external_name()));
  13.351 +          *trace_name_printed = true;
  13.352 +        }
  13.353 +        // RC_TRACE macro has an embedded ResourceMark
  13.354 +        RC_TRACE(0x00400000, ("MemberName method update: %s(%s)",
  13.355 +                              new_method->name()->as_C_string(),
  13.356 +                              new_method->signature()->as_C_string()));
  13.357 +      }
  13.358 +    }
  13.359 +  }
  13.360 +}
  13.361 +#endif // INCLUDE_JVMTI
  13.362 +
  13.363  //
  13.364  // Here are the native methods in java.lang.invoke.MethodHandleNatives
  13.365  // They are the private interface between this JVM and the HotSpot-specific
  13.366 @@ -1010,8 +1115,8 @@
  13.367    if (mname_jh == NULL) { THROW_MSG(vmSymbols::java_lang_InternalError(), "mname is null"); }
  13.368    if (target_jh == NULL) { THROW_MSG(vmSymbols::java_lang_InternalError(), "target is null"); }
  13.369    Handle mname(THREAD, JNIHandles::resolve_non_null(mname_jh));
  13.370 -  oop target_oop = JNIHandles::resolve_non_null(target_jh);
  13.371 -  MethodHandles::init_MemberName(mname(), target_oop);
  13.372 +  Handle target(THREAD, JNIHandles::resolve_non_null(target_jh));
  13.373 +  MethodHandles::init_MemberName(mname, target);
  13.374  }
  13.375  JVM_END
  13.376  
  13.377 @@ -1118,7 +1223,7 @@
  13.378      x = ((Klass*) vmtarget)->java_mirror();
  13.379    } else if (vmtarget->is_method()) {
  13.380      Handle mname2 = MethodHandles::new_MemberName(CHECK_NULL);
  13.381 -    x = MethodHandles::init_method_MemberName(mname2(), (Method*)vmtarget, false, NULL);
  13.382 +    x = MethodHandles::init_method_MemberName(mname2, (Method*)vmtarget, false, NULL);
  13.383    }
  13.384    result->obj_at_put(1, x);
  13.385    return JNIHandles::make_local(env, result());
  13.386 @@ -1161,8 +1266,8 @@
  13.387      // %%% TO DO
  13.388    }
  13.389  
  13.390 -  int res = MethodHandles::find_MemberNames(k(), name, sig, mflags,
  13.391 -                                            caller(), skip, results());
  13.392 +  int res = MethodHandles::find_MemberNames(k, name, sig, mflags,
  13.393 +                                            caller, skip, results);
  13.394    // TO DO: expand at least some of the MemberNames, to avoid massive callbacks
  13.395    return res;
  13.396  }
    14.1 --- a/src/share/vm/prims/methodHandles.hpp	Fri Apr 26 08:33:39 2013 -0700
    14.2 +++ b/src/share/vm/prims/methodHandles.hpp	Fri Apr 26 14:50:23 2013 -0400
    14.3 @@ -54,23 +54,23 @@
    14.4    static Handle resolve_MemberName(Handle mname, TRAPS); // compute vmtarget/vmindex from name/type
    14.5    static void expand_MemberName(Handle mname, int suppress, TRAPS);  // expand defc/name/type if missing
    14.6    static Handle new_MemberName(TRAPS);  // must be followed by init_MemberName
    14.7 -  static oop init_MemberName(oop mname_oop, oop target_oop); // compute vmtarget/vmindex from target
    14.8 -  static oop init_method_MemberName(oop mname_oop, Method* m, bool do_dispatch,
    14.9 -                                    Klass* receiver_limit);
   14.10 -  static oop init_field_MemberName(oop mname_oop, Klass* field_holder,
   14.11 +  static oop init_MemberName(Handle mname_h, Handle target_h); // compute vmtarget/vmindex from target
   14.12 +  static oop init_method_MemberName(Handle mname_h, Method* m, bool do_dispatch,
   14.13 +                                    KlassHandle receiver_limit_h);
   14.14 +  static oop init_field_MemberName(Handle mname_h, KlassHandle field_holder_h,
   14.15                                     AccessFlags mods, oop type, oop name,
   14.16                                     intptr_t offset, bool is_setter = false);
   14.17 -  static Handle init_method_MemberName(oop mname_oop, CallInfo& info, TRAPS);
   14.18 -  static Handle init_field_MemberName(oop mname_oop, FieldAccessInfo& info, TRAPS);
   14.19 +  static Handle init_method_MemberName(Handle mname_h, CallInfo& info, TRAPS);
   14.20 +  static Handle init_field_MemberName(Handle mname_h, FieldAccessInfo& info, TRAPS);
   14.21    static int method_ref_kind(Method* m, bool do_dispatch_if_possible = true);
   14.22 -  static int find_MemberNames(Klass* k, Symbol* name, Symbol* sig,
   14.23 -                              int mflags, Klass* caller,
   14.24 -                              int skip, objArrayOop results);
   14.25 +  static int find_MemberNames(KlassHandle k, Symbol* name, Symbol* sig,
   14.26 +                              int mflags, KlassHandle caller,
   14.27 +                              int skip, objArrayHandle results);
   14.28    // bit values for suppress argument to expand_MemberName:
   14.29    enum { _suppress_defc = 1, _suppress_name = 2, _suppress_type = 4 };
   14.30  
   14.31    // Generate MethodHandles adapters.
   14.32 -  static void generate_adapters();
   14.33 +                              static void generate_adapters();
   14.34  
   14.35    // Called from MethodHandlesAdapterGenerator.
   14.36    static address generate_method_handle_interpreter_entry(MacroAssembler* _masm, vmIntrinsics::ID iid);
   14.37 @@ -230,4 +230,27 @@
   14.38    void generate();
   14.39  };
   14.40  
   14.41 +//------------------------------------------------------------------------------
   14.42 +// MemberNameTable
   14.43 +//
   14.44 +class MemberNameTable : public GrowableArray<jweak> {
   14.45 + public:
   14.46 +  MemberNameTable();
   14.47 +  ~MemberNameTable();
   14.48 +  void add_member_name(jweak mem_name_ref);
   14.49 + private:
   14.50 +  int find_member_name(oop mem_name);
   14.51 +
   14.52 +#if INCLUDE_JVMTI
   14.53 + public:
   14.54 +  // RedefineClasses() API support:
   14.55 +  // If a MemberName refers to old_method then update it
   14.56 +  // to refer to new_method.
   14.57 +  void adjust_method_entries(Method** old_methods, Method** new_methods,
   14.58 +                             int methods_length, bool *trace_name_printed);
   14.59 + private:
   14.60 +  oop find_member_name_by_method(Method* old_method);
   14.61 +#endif // INCLUDE_JVMTI
   14.62 +};
   14.63 +
   14.64  #endif // SHARE_VM_PRIMS_METHODHANDLES_HPP
    15.1 --- a/src/share/vm/runtime/arguments.cpp	Fri Apr 26 08:33:39 2013 -0700
    15.2 +++ b/src/share/vm/runtime/arguments.cpp	Fri Apr 26 14:50:23 2013 -0400
    15.3 @@ -1901,7 +1901,7 @@
    15.4  
    15.5    // Divide by bucket size to prevent a large size from causing rollover when
    15.6    // calculating amount of memory needed to be allocated for the String table.
    15.7 -  status = status && verify_interval(StringTableSize, defaultStringTableSize,
    15.8 +  status = status && verify_interval(StringTableSize, minimumStringTableSize,
    15.9      (max_uintx / StringTable::bucket_size()), "StringTable size");
   15.10  
   15.11    if (MinHeapFreeRatio > MaxHeapFreeRatio) {
    16.1 --- a/src/share/vm/runtime/mutexLocker.cpp	Fri Apr 26 08:33:39 2013 -0700
    16.2 +++ b/src/share/vm/runtime/mutexLocker.cpp	Fri Apr 26 14:50:23 2013 -0400
    16.3 @@ -46,6 +46,7 @@
    16.4  Mutex*   JNIGlobalHandle_lock         = NULL;
    16.5  Mutex*   JNIHandleBlockFreeList_lock  = NULL;
    16.6  Mutex*   JNICachedItableIndex_lock    = NULL;
    16.7 +Mutex*   MemberNameTable_lock         = NULL;
    16.8  Mutex*   JmethodIdCreation_lock       = NULL;
    16.9  Mutex*   JfieldIdCreation_lock        = NULL;
   16.10  Monitor* JNICritical_lock             = NULL;
   16.11 @@ -252,6 +253,7 @@
   16.12    def(Heap_lock                    , Monitor, nonleaf+1,   false);
   16.13    def(JfieldIdCreation_lock        , Mutex  , nonleaf+1,   true ); // jfieldID, Used in VM_Operation
   16.14    def(JNICachedItableIndex_lock    , Mutex  , nonleaf+1,   false); // Used to cache an itable index during JNI invoke
   16.15 +  def(MemberNameTable_lock         , Mutex  , nonleaf+1,   false); // Used to protect MemberNameTable
   16.16  
   16.17    def(CompiledIC_lock              , Mutex  , nonleaf+2,   false); // locks VtableStubs_lock, InlineCacheBuffer_lock
   16.18    def(CompileTaskAlloc_lock        , Mutex  , nonleaf+2,   true );
    17.1 --- a/src/share/vm/runtime/mutexLocker.hpp	Fri Apr 26 08:33:39 2013 -0700
    17.2 +++ b/src/share/vm/runtime/mutexLocker.hpp	Fri Apr 26 14:50:23 2013 -0400
    17.3 @@ -51,6 +51,7 @@
    17.4  extern Mutex*   JNIGlobalHandle_lock;            // a lock on creating JNI global handles
    17.5  extern Mutex*   JNIHandleBlockFreeList_lock;     // a lock on the JNI handle block free list
    17.6  extern Mutex*   JNICachedItableIndex_lock;       // a lock on caching an itable index during JNI invoke
    17.7 +extern Mutex*   MemberNameTable_lock;            // a lock on the MemberNameTable updates
    17.8  extern Mutex*   JmethodIdCreation_lock;          // a lock on creating JNI method identifiers
    17.9  extern Mutex*   JfieldIdCreation_lock;           // a lock on creating JNI static field identifiers
   17.10  extern Monitor* JNICritical_lock;                // a lock used while entering and exiting JNI critical regions, allows GC to sometimes get in
    18.1 --- a/src/share/vm/services/management.cpp	Fri Apr 26 08:33:39 2013 -0700
    18.2 +++ b/src/share/vm/services/management.cpp	Fri Apr 26 14:50:23 2013 -0400
    18.3 @@ -2126,7 +2126,7 @@
    18.4      THROW_MSG_(vmSymbols::java_lang_NullPointerException(),
    18.5                 "Output file name cannot be null.", -1);
    18.6    }
    18.7 -  char* name = java_lang_String::as_utf8_string(on);
    18.8 +  char* name = java_lang_String::as_platform_dependent_str(on, CHECK_(-1));
    18.9    if (name == NULL) {
   18.10      THROW_MSG_(vmSymbols::java_lang_NullPointerException(),
   18.11                 "Output file name cannot be null.", -1);
    19.1 --- a/src/share/vm/services/memBaseline.hpp	Fri Apr 26 08:33:39 2013 -0700
    19.2 +++ b/src/share/vm/services/memBaseline.hpp	Fri Apr 26 14:50:23 2013 -0400
    19.3 @@ -133,7 +133,7 @@
    19.4  
    19.5  
    19.6  // This class aggregates malloc'd records by memory type
    19.7 -class MallocMem : public _ValueObj {
    19.8 +class MallocMem VALUE_OBJ_CLASS_SPEC {
    19.9   private:
   19.10    MEMFLAGS       _type;
   19.11  
   19.12 @@ -211,7 +211,7 @@
   19.13  };
   19.14  
   19.15  // This class aggregates virtual memory by its memory type
   19.16 -class VMMem : public _ValueObj {
   19.17 +class VMMem VALUE_OBJ_CLASS_SPEC {
   19.18   private:
   19.19    MEMFLAGS       _type;
   19.20  
   19.21 @@ -296,7 +296,7 @@
   19.22   * aggregates memory usage by callsites when detail tracking
   19.23   * is on.
   19.24   */
   19.25 -class MemBaseline : public _ValueObj {
   19.26 +class MemBaseline VALUE_OBJ_CLASS_SPEC {
   19.27    friend class BaselineReporter;
   19.28    friend class BaselineComparisonReporter;
   19.29  
    20.1 --- a/src/share/vm/services/memPtr.hpp	Fri Apr 26 08:33:39 2013 -0700
    20.2 +++ b/src/share/vm/services/memPtr.hpp	Fri Apr 26 14:50:23 2013 -0400
    20.3 @@ -89,7 +89,7 @@
    20.4   * the memory pointer either points to a malloc'd
    20.5   * memory block, or a mmap'd memory block
    20.6   */
    20.7 -class MemPointer : public _ValueObj {
    20.8 +class MemPointer VALUE_OBJ_CLASS_SPEC {
    20.9   public:
   20.10    MemPointer(): _addr(0) { }
   20.11    MemPointer(address addr): _addr(addr) { }
    21.1 --- a/src/share/vm/services/memSnapshot.hpp	Fri Apr 26 08:33:39 2013 -0700
    21.2 +++ b/src/share/vm/services/memSnapshot.hpp	Fri Apr 26 14:50:23 2013 -0400
    21.3 @@ -308,7 +308,7 @@
    21.4    }
    21.5  };
    21.6  
    21.7 -class StagingArea : public _ValueObj {
    21.8 +class StagingArea VALUE_OBJ_CLASS_SPEC {
    21.9   private:
   21.10    MemPointerArray*   _malloc_data;
   21.11    MemPointerArray*   _vm_data;
    22.1 --- a/src/share/vm/services/memTrackWorker.hpp	Fri Apr 26 08:33:39 2013 -0700
    22.2 +++ b/src/share/vm/services/memTrackWorker.hpp	Fri Apr 26 14:50:23 2013 -0400
    22.3 @@ -32,7 +32,7 @@
    22.4  // Maximum MAX_GENERATIONS generation data can be tracked.
    22.5  #define MAX_GENERATIONS  512
    22.6  
    22.7 -class GenerationData : public _ValueObj {
    22.8 +class GenerationData VALUE_OBJ_CLASS_SPEC {
    22.9   private:
   22.10    int           _number_of_classes;
   22.11    MemRecorder*  _recorder_list;
    23.1 --- a/src/share/vm/utilities/globalDefinitions.hpp	Fri Apr 26 08:33:39 2013 -0700
    23.2 +++ b/src/share/vm/utilities/globalDefinitions.hpp	Fri Apr 26 14:50:23 2013 -0400
    23.3 @@ -328,9 +328,10 @@
    23.4  
    23.5  
    23.6  //----------------------------------------------------------------------------------------------------
    23.7 -// Minimum StringTableSize value
    23.8 +// Default and minimum StringTableSize values
    23.9  
   23.10 -const int defaultStringTableSize=1009;
   23.11 +const int defaultStringTableSize = NOT_LP64(1009) LP64_ONLY(60013);
   23.12 +const int minimumStringTableSize=1009;
   23.13  
   23.14  
   23.15  //----------------------------------------------------------------------------------------------------

mercurial