Tue, 21 Mar 2017 12:20:10 -0700
Merge
1.1 --- a/.hgtags Tue Mar 21 12:11:02 2017 -0700 1.2 +++ b/.hgtags Tue Mar 21 12:20:10 2017 -0700 1.3 @@ -949,6 +949,10 @@ 1.4 90f94521c3515e5f27af0ab9b31d036e88bb322a jdk8u121-b13 1.5 351bf1d4ff9a41137f91e2ec97ec59ed29a38d8b jdk8u121-b31 1.6 41daac438a2ac5a80755dc3de88b76e4ac66750a jdk8u121-b32 1.7 +eb9e617d6f64d4ad689feac0707b5e4335b00ce2 jdk8u121-b33 1.8 +c60b0994e8eee152666252c3ba4105db65c004db jdk8u121-b34 1.9 +0612a789929b88612509668bea4b3138613e91e4 jdk8u121-b35 1.10 +0ea269e49511a890e6fabfd468638dd1c0ed0be3 jdk8u121-b36 1.11 c0a1ba0df20fda10ddb8599e888eb56ad98b3874 jdk8u131-b00 1.12 0b85ccd6240991e1a501602ff5addec6b88ae0af jdk8u131-b01 1.13 ef90c721a4e59b01ca36f25619010a1afe9ed4d5 jdk8u131-b02
2.1 --- a/src/os/linux/vm/os_linux.cpp Tue Mar 21 12:11:02 2017 -0700 2.2 +++ b/src/os/linux/vm/os_linux.cpp Tue Mar 21 12:20:10 2017 -0700 2.3 @@ -2859,7 +2859,7 @@ 2.4 // in the library. 2.5 const size_t BitsPerCLong = sizeof(long) * CHAR_BIT; 2.6 2.7 - size_t cpu_num = os::active_processor_count(); 2.8 + size_t cpu_num = processor_count(); 2.9 size_t cpu_map_size = NCPUS / BitsPerCLong; 2.10 size_t cpu_map_valid_size = 2.11 MIN2((cpu_num + BitsPerCLong - 1) / BitsPerCLong, cpu_map_size);
3.1 --- a/src/share/vm/classfile/javaClasses.cpp Tue Mar 21 12:11:02 2017 -0700 3.2 +++ b/src/share/vm/classfile/javaClasses.cpp Tue Mar 21 12:20:10 2017 -0700 3.3 @@ -1,5 +1,5 @@ 3.4 /* 3.5 - * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. 3.6 + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. 3.7 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3.8 * 3.9 * This code is free software; you can redistribute it and/or modify it 3.10 @@ -2852,6 +2852,15 @@ 3.11 mname->address_field_put(_vmindex_offset, (address) index); 3.12 } 3.13 3.14 +bool java_lang_invoke_MemberName::equals(oop mn1, oop mn2) { 3.15 + if (mn1 == mn2) { 3.16 + return true; 3.17 + } 3.18 + return (vmtarget(mn1) == vmtarget(mn2) && flags(mn1) == flags(mn2) && 3.19 + vmindex(mn1) == vmindex(mn2) && 3.20 + clazz(mn1) == clazz(mn2)); 3.21 +} 3.22 + 3.23 oop java_lang_invoke_LambdaForm::vmentry(oop lform) { 3.24 assert(is_instance(lform), "wrong type"); 3.25 return lform->obj_field(_vmentry_offset);
4.1 --- a/src/share/vm/classfile/javaClasses.hpp Tue Mar 21 12:11:02 2017 -0700 4.2 +++ b/src/share/vm/classfile/javaClasses.hpp Tue Mar 21 12:20:10 2017 -0700 4.3 @@ -1,5 +1,5 @@ 4.4 /* 4.5 - * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. 4.6 + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. 4.7 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4.8 * 4.9 * This code is free software; you can redistribute it and/or modify it 4.10 @@ -1132,6 +1132,8 @@ 4.11 static int flags_offset_in_bytes() { return _flags_offset; } 4.12 static int vmtarget_offset_in_bytes() { return _vmtarget_offset; } 4.13 static int vmindex_offset_in_bytes() { return _vmindex_offset; } 4.14 + 4.15 + static bool equals(oop mt1, oop mt2); 4.16 }; 4.17 4.18
5.1 --- a/src/share/vm/oops/instanceKlass.cpp Tue Mar 21 12:11:02 2017 -0700 5.2 +++ b/src/share/vm/oops/instanceKlass.cpp Tue Mar 21 12:20:10 2017 -0700 5.3 @@ -3018,7 +3018,7 @@ 5.4 return NULL; 5.5 } 5.6 5.7 -bool InstanceKlass::add_member_name(Handle mem_name) { 5.8 +oop InstanceKlass::add_member_name(Handle mem_name, bool intern) { 5.9 jweak mem_name_wref = JNIHandles::make_weak_global(mem_name); 5.10 MutexLocker ml(MemberNameTable_lock); 5.11 DEBUG_ONLY(No_Safepoint_Verifier nsv); 5.12 @@ -3028,7 +3028,7 @@ 5.13 // is called! 5.14 Method* method = (Method*)java_lang_invoke_MemberName::vmtarget(mem_name()); 5.15 if (method->is_obsolete()) { 5.16 - return false; 5.17 + return NULL; 5.18 } else if (method->is_old()) { 5.19 // Replace method with redefined version 5.20 java_lang_invoke_MemberName::set_vmtarget(mem_name(), method_with_idnum(method->method_idnum())); 5.21 @@ -3037,8 +3037,11 @@ 5.22 if (_member_names == NULL) { 5.23 _member_names = new (ResourceObj::C_HEAP, mtClass) MemberNameTable(idnum_allocated_count()); 5.24 } 5.25 - _member_names->add_member_name(mem_name_wref); 5.26 - return true; 5.27 + if (intern) { 5.28 + return _member_names->find_or_add_member_name(mem_name_wref); 5.29 + } else { 5.30 + return _member_names->add_member_name(mem_name_wref); 5.31 + } 5.32 } 5.33 5.34 // -----------------------------------------------------------------------------------------------------
6.1 --- a/src/share/vm/oops/instanceKlass.hpp Tue Mar 21 12:11:02 2017 -0700 6.2 +++ b/src/share/vm/oops/instanceKlass.hpp Tue Mar 21 12:20:10 2017 -0700 6.3 @@ -1105,7 +1105,7 @@ 6.4 // JSR-292 support 6.5 MemberNameTable* member_names() { return _member_names; } 6.6 void set_member_names(MemberNameTable* member_names) { _member_names = member_names; } 6.7 - bool add_member_name(Handle member_name); 6.8 + oop add_member_name(Handle member_name, bool intern); 6.9 6.10 public: 6.11 // JVMTI support
7.1 --- a/src/share/vm/prims/jvm.cpp Tue Mar 21 12:11:02 2017 -0700 7.2 +++ b/src/share/vm/prims/jvm.cpp Tue Mar 21 12:20:10 2017 -0700 7.3 @@ -643,7 +643,7 @@ 7.4 // This can safepoint and redefine method, so need both new_obj and method 7.5 // in a handle, for two different reasons. new_obj can move, method can be 7.6 // deleted if nothing is using it on the stack. 7.7 - m->method_holder()->add_member_name(new_obj()); 7.8 + m->method_holder()->add_member_name(new_obj(), false); 7.9 } 7.10 } 7.11
8.1 --- a/src/share/vm/prims/methodHandles.cpp Tue Mar 21 12:11:02 2017 -0700 8.2 +++ b/src/share/vm/prims/methodHandles.cpp Tue Mar 21 12:20:10 2017 -0700 8.3 @@ -173,7 +173,7 @@ 8.4 return NULL; 8.5 } 8.6 8.7 -oop MethodHandles::init_method_MemberName(Handle mname, CallInfo& info) { 8.8 +oop MethodHandles::init_method_MemberName(Handle mname, CallInfo& info, bool intern) { 8.9 assert(info.resolved_appendix().is_null(), "only normal methods here"); 8.10 methodHandle m = info.resolved_method(); 8.11 KlassHandle m_klass = m->method_holder(); 8.12 @@ -270,13 +270,7 @@ 8.13 // If relevant, the vtable or itable value is stored as vmindex. 8.14 // This is done eagerly, since it is readily available without 8.15 // constructing any new objects. 8.16 - // TO DO: maybe intern mname_oop 8.17 - if (m->method_holder()->add_member_name(mname)) { 8.18 - return mname(); 8.19 - } else { 8.20 - // Redefinition caused this to fail. Return NULL (and an exception?) 8.21 - return NULL; 8.22 - } 8.23 + return m->method_holder()->add_member_name(mname, intern); 8.24 } 8.25 8.26 oop MethodHandles::init_field_MemberName(Handle mname, fieldDescriptor& fd, bool is_setter) { 8.27 @@ -917,7 +911,9 @@ 8.28 if (!java_lang_invoke_MemberName::is_instance(result())) 8.29 return -99; // caller bug! 8.30 CallInfo info(m); 8.31 - oop saved = MethodHandles::init_method_MemberName(result, info); 8.32 + // Since this is going through the methods to create MemberNames, don't search 8.33 + // for matching methods already in the table 8.34 + oop saved = MethodHandles::init_method_MemberName(result, info, /*intern*/false); 8.35 if (saved != result()) 8.36 results->obj_at_put(rfill-1, saved); // show saved instance to user 8.37 } else if (++overflow >= overflow_limit) { 8.38 @@ -949,9 +945,34 @@ 8.39 } 8.40 } 8.41 8.42 -void MemberNameTable::add_member_name(jweak mem_name_wref) { 8.43 +oop MemberNameTable::add_member_name(jweak mem_name_wref) { 8.44 assert_locked_or_safepoint(MemberNameTable_lock); 8.45 this->push(mem_name_wref); 8.46 + return JNIHandles::resolve(mem_name_wref); 8.47 +} 8.48 + 8.49 +oop MemberNameTable::find_or_add_member_name(jweak mem_name_wref) { 8.50 + assert_locked_or_safepoint(MemberNameTable_lock); 8.51 + oop new_mem_name = JNIHandles::resolve(mem_name_wref); 8.52 + 8.53 + // Find matching member name in the list. 8.54 + // This is linear because these are short lists. 8.55 + int len = this->length(); 8.56 + int new_index = len; 8.57 + for (int idx = 0; idx < len; idx++) { 8.58 + oop mname = JNIHandles::resolve(this->at(idx)); 8.59 + if (mname == NULL) { 8.60 + new_index = idx; 8.61 + continue; 8.62 + } 8.63 + if (java_lang_invoke_MemberName::equals(new_mem_name, mname)) { 8.64 + JNIHandles::destroy_weak_global(mem_name_wref); 8.65 + return mname; 8.66 + } 8.67 + } 8.68 + // Not found, push the new one, or reuse empty slot 8.69 + this->at_put_grow(new_index, mem_name_wref); 8.70 + return new_mem_name; 8.71 } 8.72 8.73 #if INCLUDE_JVMTI
9.1 --- a/src/share/vm/prims/methodHandles.hpp Tue Mar 21 12:11:02 2017 -0700 9.2 +++ b/src/share/vm/prims/methodHandles.hpp Tue Mar 21 12:20:10 2017 -0700 9.3 @@ -1,5 +1,5 @@ 9.4 /* 9.5 - * Copyright (c) 2008, 2014, Oracle and/or its affiliates. All rights reserved. 9.6 + * Copyright (c) 2008, 2017, 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 9.10 @@ -60,7 +60,7 @@ 9.11 static Handle new_MemberName(TRAPS); // must be followed by init_MemberName 9.12 static oop init_MemberName(Handle mname_h, Handle target_h); // compute vmtarget/vmindex from target 9.13 static oop init_field_MemberName(Handle mname_h, fieldDescriptor& fd, bool is_setter = false); 9.14 - static oop init_method_MemberName(Handle mname_h, CallInfo& info); 9.15 + static oop init_method_MemberName(Handle mname_h, CallInfo& info, bool intern = true); 9.16 static int method_ref_kind(Method* m, bool do_dispatch_if_possible = true); 9.17 static int find_MemberNames(KlassHandle k, Symbol* name, Symbol* sig, 9.18 int mflags, KlassHandle caller, 9.19 @@ -236,7 +236,8 @@ 9.20 public: 9.21 MemberNameTable(int methods_cnt); 9.22 ~MemberNameTable(); 9.23 - void add_member_name(jweak mem_name_ref); 9.24 + oop add_member_name(jweak mem_name_ref); 9.25 + oop find_or_add_member_name(jweak mem_name_ref); 9.26 9.27 #if INCLUDE_JVMTI 9.28 // RedefineClasses() API support: