Fri, 26 Apr 2013 14:50:23 -0400
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 //----------------------------------------------------------------------------------------------------