# HG changeset patch # User duke # Date 1499277135 -7200 # Node ID 6c9ff31edda0a0c097bdcd9d022306a45a2bc8ee # Parent d553e7400295f5eaf4836a2e8934e7885eb53175# Parent c9c792663607f7eaa7a3d190073344841c468035 Merge diff -r d553e7400295 -r 6c9ff31edda0 .hgtags-top-repo --- a/.hgtags-top-repo Wed Jul 30 11:49:21 2014 -0700 +++ b/.hgtags-top-repo Wed Jul 05 19:52:15 2017 +0200 @@ -266,3 +266,4 @@ 9052803f4d01feda28b3d65f2b64dd457d21c7b6 jdk9-b21 8e4bdab4c362aadde2d321f968cd503a2f779e2f jdk9-b22 88567461a2cd9b7fb431fee6440005a694df1f47 jdk9-b23 +1d4a293fbec19dc2d5790bbb2c7dd0ed8f265484 jdk9-b24 diff -r d553e7400295 -r 6c9ff31edda0 common/autoconf/generated-configure.sh --- a/common/autoconf/generated-configure.sh Wed Jul 30 11:49:21 2014 -0700 +++ b/common/autoconf/generated-configure.sh Wed Jul 05 19:52:15 2017 +0200 @@ -4311,7 +4311,7 @@ #CUSTOM_AUTOCONF_INCLUDE # Do not change or remove the following line, it is needed for consistency checks: -DATE_WHEN_GENERATED=1404942241 +DATE_WHEN_GENERATED=1405336663 ############################################################################### # @@ -14548,7 +14548,7 @@ if test "x$JVM_VARIANT_ZEROSHARK" = xtrue ; then INCLUDE_SA=false fi - if test "x$VAR_CPU" = xppc64 ; then + if test "x$OPENJDK_TARGET_OS" = xaix ; then INCLUDE_SA=false fi diff -r d553e7400295 -r 6c9ff31edda0 common/autoconf/jdk-options.m4 --- a/common/autoconf/jdk-options.m4 Wed Jul 30 11:49:21 2014 -0700 +++ b/common/autoconf/jdk-options.m4 Wed Jul 05 19:52:15 2017 +0200 @@ -158,7 +158,7 @@ if test "x$JVM_VARIANT_ZEROSHARK" = xtrue ; then INCLUDE_SA=false fi - if test "x$VAR_CPU" = xppc64 ; then + if test "x$OPENJDK_TARGET_OS" = xaix ; then INCLUDE_SA=false fi AC_SUBST(INCLUDE_SA) diff -r d553e7400295 -r 6c9ff31edda0 corba/.hgtags --- a/corba/.hgtags Wed Jul 30 11:49:21 2014 -0700 +++ b/corba/.hgtags Wed Jul 05 19:52:15 2017 +0200 @@ -266,3 +266,4 @@ 3615a4e7f0542ca7552ad6454b742c73ee211d8e jdk9-b21 ddc07abf4307855c0dc904cc5c96cc764023a930 jdk9-b22 57735d66face054440a63ce99789eac5a5ee1dfd jdk9-b23 +8a44142bb7fc8118f70f91a1b97c12dfc50563ee jdk9-b24 diff -r d553e7400295 -r 6c9ff31edda0 hotspot/.hgtags --- a/hotspot/.hgtags Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/.hgtags Wed Jul 05 19:52:15 2017 +0200 @@ -426,3 +426,4 @@ 17b4a5e831b398738feedb0afe75245744510153 jdk9-b21 518d1fcc0799494f013e00e0a94a91b6f212d54f jdk9-b22 dd472cdacc32e3afc7c5bfa7ef16ea0e0befb7fa jdk9-b23 +dde2d03b0ea46a27650839e3a1d212c7c1f7b4c8 jdk9-b24 diff -r d553e7400295 -r 6c9ff31edda0 hotspot/agent/src/share/classes/sun/jvm/hotspot/HotSpotAgent.java --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/HotSpotAgent.java Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/HotSpotAgent.java Wed Jul 05 19:52:15 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -33,6 +33,7 @@ import sun.jvm.hotspot.debugger.JVMDebugger; import sun.jvm.hotspot.debugger.MachineDescription; import sun.jvm.hotspot.debugger.MachineDescriptionAMD64; +import sun.jvm.hotspot.debugger.MachineDescriptionPPC64; import sun.jvm.hotspot.debugger.MachineDescriptionIA64; import sun.jvm.hotspot.debugger.MachineDescriptionIntelX86; import sun.jvm.hotspot.debugger.MachineDescriptionSPARC32Bit; @@ -588,6 +589,8 @@ machDesc = new MachineDescriptionIA64(); } else if (cpu.equals("amd64")) { machDesc = new MachineDescriptionAMD64(); + } else if (cpu.equals("ppc64")) { + machDesc = new MachineDescriptionPPC64(); } else if (cpu.equals("sparc")) { if (LinuxDebuggerLocal.getAddressSize()==8) { machDesc = new MachineDescriptionSPARC64Bit(); diff -r d553e7400295 -r 6c9ff31edda0 hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/MachineDescriptionPPC64.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/MachineDescriptionPPC64.java Wed Jul 05 19:52:15 2017 +0200 @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +package sun.jvm.hotspot.debugger; + +public class MachineDescriptionPPC64 extends MachineDescriptionTwosComplement implements MachineDescription { + public long getAddressSize() { + return 8; + } + + public boolean isLP64() { + return true; + } + + public boolean isBigEndian() { + return true; + } +} diff -r d553e7400295 -r 6c9ff31edda0 hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/PlatformInfo.java --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/PlatformInfo.java Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/PlatformInfo.java Wed Jul 05 19:52:15 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -61,7 +61,7 @@ return "x86"; } else if (cpu.equals("sparc") || cpu.equals("sparcv9")) { return "sparc"; - } else if (cpu.equals("ia64") || cpu.equals("amd64") || cpu.equals("x86_64")) { + } else if (cpu.equals("ia64") || cpu.equals("amd64") || cpu.equals("x86_64") || cpu.equals("ppc64")) { return cpu; } else { try { diff -r d553e7400295 -r 6c9ff31edda0 hotspot/make/aix/makefiles/buildtree.make --- a/hotspot/make/aix/makefiles/buildtree.make Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/make/aix/makefiles/buildtree.make Wed Jul 05 19:52:15 2017 +0200 @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. # Copyright 2012, 2013 SAP AG. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # @@ -274,6 +274,8 @@ echo; \ [ -n "$(SPEC)" ] && \ echo "include $(SPEC)"; \ + echo "CP ?= cp"; \ + echo "MV ?= mv"; \ echo "include \$$(GAMMADIR)/make/$(OS_FAMILY)/makefiles/$(VARIANT).make"; \ echo "include \$$(GAMMADIR)/make/excludeSrc.make"; \ echo "include \$$(GAMMADIR)/make/$(OS_FAMILY)/makefiles/$(COMPILER).make"; \ diff -r d553e7400295 -r 6c9ff31edda0 hotspot/make/aix/makefiles/jsig.make --- a/hotspot/make/aix/makefiles/jsig.make Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/make/aix/makefiles/jsig.make Wed Jul 05 19:52:15 2017 +0200 @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. # Copyright 2012, 2013 SAP AG. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # @@ -20,7 +20,7 @@ # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions. -# +# # # Rules to build signal interposition library, used by vm.make @@ -40,8 +40,8 @@ LIBJSIG_MAPFILE = $(MAKEFILES_DIR)/mapfile-vers-jsig -# On Linux we really dont want a mapfile, as this library is small -# and preloaded using LD_PRELOAD, making functions private will +# On Linux we really dont want a mapfile, as this library is small +# and preloaded using LD_PRELOAD, making functions private will # cause problems with interposing. See CR: 6466665 # LFLAGS_JSIG += $(MAPFLAG:FILENAME=$(LIBJSIG_MAPFILE)) @@ -79,9 +79,9 @@ install_jsig: $(LIBJSIG) @echo "Copying $(LIBJSIG) to $(DEST_JSIG)" $(QUIETLY) test -f $(LIBJSIG_DEBUGINFO) && \ - cp -f $(LIBJSIG_DEBUGINFO) $(DEST_JSIG_DEBUGINFO) + $(CP) -f $(LIBJSIG_DEBUGINFO) $(DEST_JSIG_DEBUGINFO) $(QUIETLY) test -f $(LIBJSIG_DIZ) && \ - cp -f $(LIBJSIG_DIZ) $(DEST_JSIG_DIZ) - $(QUIETLY) cp -f $(LIBJSIG) $(DEST_JSIG) && echo "Done" + $(CP) -f $(LIBJSIG_DIZ) $(DEST_JSIG_DIZ) + $(QUIETLY) $(CP) -f $(LIBJSIG) $(DEST_JSIG) && echo "Done" .PHONY: install_jsig diff -r d553e7400295 -r 6c9ff31edda0 hotspot/make/aix/makefiles/rules.make --- a/hotspot/make/aix/makefiles/rules.make Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/make/aix/makefiles/rules.make Wed Jul 05 19:52:15 2017 +0200 @@ -1,5 +1,5 @@ # -# Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -19,7 +19,7 @@ # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions. -# +# # # Common rules/macros for the vm, adlc. @@ -28,7 +28,7 @@ .SUFFIXES: .cpp $(SUFFIXES) DEMANGLER = c++filt -DEMANGLE = $(DEMANGLER) < $@ > .$@ && mv -f .$@ $@ +DEMANGLE = $(DEMANGLER) < $@ > .$@ && $(MV) -f .$@ $@ # $(CC) is the c compiler (cc/gcc), $(CXX) is the c++ compiler (CC/g++). CC_COMPILE = $(CC) $(CXXFLAGS) $(CFLAGS) diff -r d553e7400295 -r 6c9ff31edda0 hotspot/make/aix/makefiles/sa.make --- a/hotspot/make/aix/makefiles/sa.make Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/make/aix/makefiles/sa.make Wed Jul 05 19:52:15 2017 +0200 @@ -1,5 +1,5 @@ # -# Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. # Copyright 2012, 2013 SAP AG. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # @@ -98,11 +98,11 @@ $(QUIETLY) $(REMOTE) $(COMPILE.RMIC) -classpath $(SA_CLASSDIR) -d $(SA_CLASSDIR) sun.jvm.hotspot.debugger.remote.RemoteDebuggerServer $(QUIETLY) echo "$(SA_BUILD_VERSION_PROP)" > $(SA_PROPERTIES) $(QUIETLY) rm -f $(SA_CLASSDIR)/sun/jvm/hotspot/utilities/soql/sa.js - $(QUIETLY) cp $(AGENT_SRC_DIR)/sun/jvm/hotspot/utilities/soql/sa.js $(SA_CLASSDIR)/sun/jvm/hotspot/utilities/soql + $(QUIETLY) $(CP) $(AGENT_SRC_DIR)/sun/jvm/hotspot/utilities/soql/sa.js $(SA_CLASSDIR)/sun/jvm/hotspot/utilities/soql $(QUIETLY) mkdir -p $(SA_CLASSDIR)/sun/jvm/hotspot/ui/resources $(QUIETLY) rm -f $(SA_CLASSDIR)/sun/jvm/hotspot/ui/resources/* - $(QUIETLY) cp $(AGENT_SRC_DIR)/sun/jvm/hotspot/ui/resources/*.png $(SA_CLASSDIR)/sun/jvm/hotspot/ui/resources/ - $(QUIETLY) cp -r $(AGENT_SRC_DIR)/images/* $(SA_CLASSDIR)/ + $(QUIETLY) $(CP) $(AGENT_SRC_DIR)/sun/jvm/hotspot/ui/resources/*.png $(SA_CLASSDIR)/sun/jvm/hotspot/ui/resources/ + $(QUIETLY) $(CP) -r $(AGENT_SRC_DIR)/images/* $(SA_CLASSDIR)/ $(QUIETLY) $(REMOTE) $(RUN.JAR) cf $@ -C $(SA_CLASSDIR)/ . $(QUIETLY) $(REMOTE) $(RUN.JAR) uf $@ -C $(AGENT_SRC_DIR) META-INF/services/com.sun.jdi.connect.Connector $(QUIETLY) $(REMOTE) $(RUN.JAVAH) -classpath $(SA_CLASSDIR) -d $(GENERATED) -jni sun.jvm.hotspot.debugger.x86.X86ThreadContext diff -r d553e7400295 -r 6c9ff31edda0 hotspot/make/aix/makefiles/saproc.make --- a/hotspot/make/aix/makefiles/saproc.make Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/make/aix/makefiles/saproc.make Wed Jul 05 19:52:15 2017 +0200 @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. # Copyright 2012, 2013 SAP AG. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # @@ -20,7 +20,7 @@ # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions. -# +# # include $(GAMMADIR)/make/defs.make @@ -108,10 +108,10 @@ $(QUIETLY) if [ -e $(LIBSAPROC) ] ; then \ echo "Copying $(LIBSAPROC) to $(DEST_SAPROC)"; \ test -f $(LIBSAPROC_DEBUGINFO) && \ - cp -f $(LIBSAPROC_DEBUGINFO) $(DEST_SAPROC_DEBUGINFO); \ + $(CP) -f $(LIBSAPROC_DEBUGINFO) $(DEST_SAPROC_DEBUGINFO); \ test -f $(LIBSAPROC_DIZ) && \ - cp -f $(LIBSAPROC_DIZ) $(DEST_SAPROC_DIZ); \ - cp -f $(LIBSAPROC) $(DEST_SAPROC) && echo "Done"; \ + $(CP) -f $(LIBSAPROC_DIZ) $(DEST_SAPROC_DIZ); \ + $(CP) -f $(LIBSAPROC) $(DEST_SAPROC) && echo "Done"; \ fi .PHONY: install_saproc diff -r d553e7400295 -r 6c9ff31edda0 hotspot/make/aix/makefiles/top.make --- a/hotspot/make/aix/makefiles/top.make Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/make/aix/makefiles/top.make Wed Jul 05 19:52:15 2017 +0200 @@ -1,5 +1,5 @@ # -# Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -19,7 +19,7 @@ # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions. -# +# # # top.make is included in the Makefile in the build directories. @@ -45,10 +45,10 @@ GENERATED = $(TOPDIR)/../generated VM = $(GAMMADIR)/src/share/vm Plat_File = $(Platform_file) -CDG = cd $(GENERATED); +CDG = cd $(GENERATED); ifneq ($(USE_PRECOMPILED_HEADER),0) -UpdatePCH = $(MAKE) -f vm.make $(PRECOMPILED_HEADER) $(MFLAGS) +UpdatePCH = $(MAKE) -f vm.make $(PRECOMPILED_HEADER) $(MFLAGS) else UpdatePCH = \# precompiled header is not used endif @@ -84,7 +84,7 @@ @# We need a null action here, so implicit rules don't get consulted. $(Cached_plat): $(Plat_File) - $(CDG) cp $(Plat_File) $(Cached_plat) + $(CDG) $(CP) $(Plat_File) $(Cached_plat) # make AD files as necessary ad_stuff: $(Cached_plat) $(adjust-mflags) @@ -125,12 +125,12 @@ # next rules support "make foo.[ois]" %.o %.i %.s: - $(UpdatePCH) + $(UpdatePCH) $(MAKE) -f vm.make $(MFLAGS) $@ #$(MAKE) -f vm.make $@ # this should force everything to be rebuilt -clean: +clean: rm -f $(GENERATED)/*.class $(MAKE) -f vm.make $(MFLAGS) clean diff -r d553e7400295 -r 6c9ff31edda0 hotspot/make/aix/makefiles/vm.make --- a/hotspot/make/aix/makefiles/vm.make Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/make/aix/makefiles/vm.make Wed Jul 05 19:52:15 2017 +0200 @@ -1,5 +1,5 @@ # -# Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. # Copyright 2012, 2013 SAP AG. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # @@ -346,10 +346,10 @@ install_jvm: $(LIBJVM) @echo "Copying $(LIBJVM) to $(DEST_JVM)" $(QUIETLY) test -f $(LIBJVM_DEBUGINFO) && \ - cp -f $(LIBJVM_DEBUGINFO) $(DEST_JVM_DEBUGINFO) + $(CP) -f $(LIBJVM_DEBUGINFO) $(DEST_JVM_DEBUGINFO) $(QUIETLY) test -f $(LIBJVM_DIZ) && \ - cp -f $(LIBJVM_DIZ) $(DEST_JVM_DIZ) - $(QUIETLY) cp -f $(LIBJVM) $(DEST_JVM) && echo "Done" + $(CP) -f $(LIBJVM_DIZ) $(DEST_JVM_DIZ) + $(QUIETLY) $(CP) -f $(LIBJVM) $(DEST_JVM) && echo "Done" #---------------------------------------------------------------------- # Other files diff -r d553e7400295 -r 6c9ff31edda0 hotspot/make/bsd/makefiles/buildtree.make --- a/hotspot/make/bsd/makefiles/buildtree.make Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/make/bsd/makefiles/buildtree.make Wed Jul 05 19:52:15 2017 +0200 @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -278,6 +278,8 @@ echo; \ [ -n "$(SPEC)" ] && \ echo "include $(SPEC)"; \ + echo "CP ?= cp"; \ + echo "MV ?= mv"; \ echo "include \$$(GAMMADIR)/make/$(OS_FAMILY)/makefiles/$(VARIANT).make"; \ echo "include \$$(GAMMADIR)/make/excludeSrc.make"; \ echo "include \$$(GAMMADIR)/make/$(OS_FAMILY)/makefiles/$(COMPILER).make"; \ diff -r d553e7400295 -r 6c9ff31edda0 hotspot/make/bsd/makefiles/jsig.make --- a/hotspot/make/bsd/makefiles/jsig.make Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/make/bsd/makefiles/jsig.make Wed Jul 05 19:52:15 2017 +0200 @@ -19,7 +19,7 @@ # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions. -# +# # # Rules to build signal interposition library, used by vm.make @@ -47,8 +47,8 @@ LIBJSIG_MAPFILE = $(MAKEFILES_DIR)/mapfile-vers-jsig -# On Bsd we really dont want a mapfile, as this library is small -# and preloaded using LD_PRELOAD, making functions private will +# On Bsd we really dont want a mapfile, as this library is small +# and preloaded using LD_PRELOAD, making functions private will # cause problems with interposing. See CR: 6466665 # LFLAGS_JSIG += $(MAPFLAG:FILENAME=$(LIBJSIG_MAPFILE)) @@ -92,13 +92,13 @@ @echo "Copying $(LIBJSIG) to $(DEST_JSIG)" ifeq ($(OS_VENDOR), Darwin) $(QUIETLY) test ! -d $(LIBJSIG_DEBUGINFO) || \ - cp -f -r $(LIBJSIG_DEBUGINFO) $(DEST_JSIG_DEBUGINFO) + $(CP) -f -r $(LIBJSIG_DEBUGINFO) $(DEST_JSIG_DEBUGINFO) else $(QUIETLY) test ! -f $(LIBJSIG_DEBUGINFO) || \ - cp -f $(LIBJSIG_DEBUGINFO) $(DEST_JSIG_DEBUGINFO) + $(CP) -f $(LIBJSIG_DEBUGINFO) $(DEST_JSIG_DEBUGINFO) endif $(QUIETLY) test ! -f $(LIBJSIG_DIZ) || \ - cp -f $(LIBJSIG_DIZ) $(DEST_JSIG_DIZ) - $(QUIETLY) cp -f $(LIBJSIG) $(DEST_JSIG) && echo "Done" + $(CP) -f $(LIBJSIG_DIZ) $(DEST_JSIG_DIZ) + $(QUIETLY) $(CP) -f $(LIBJSIG) $(DEST_JSIG) && echo "Done" .PHONY: install_jsig diff -r d553e7400295 -r 6c9ff31edda0 hotspot/make/bsd/makefiles/rules.make --- a/hotspot/make/bsd/makefiles/rules.make Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/make/bsd/makefiles/rules.make Wed Jul 05 19:52:15 2017 +0200 @@ -1,5 +1,5 @@ # -# Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -19,7 +19,7 @@ # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions. -# +# # # Common rules/macros for the vm, adlc. @@ -28,7 +28,7 @@ .SUFFIXES: .cpp $(SUFFIXES) DEMANGLER = c++filt -DEMANGLE = $(DEMANGLER) < $@ > .$@ && mv -f .$@ $@ +DEMANGLE = $(DEMANGLER) < $@ > .$@ && $(MV) -f .$@ $@ # $(CC) is the c compiler (cc/gcc), $(CXX) is the c++ compiler (CC/g++). CC_COMPILE = $(CC) $(CXXFLAGS) $(CFLAGS) diff -r d553e7400295 -r 6c9ff31edda0 hotspot/make/bsd/makefiles/sa.make --- a/hotspot/make/bsd/makefiles/sa.make Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/make/bsd/makefiles/sa.make Wed Jul 05 19:52:15 2017 +0200 @@ -1,5 +1,5 @@ # -# Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -19,7 +19,7 @@ # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions. -# +# # # This makefile (sa.make) is included from the sa.make in the @@ -71,7 +71,7 @@ # if $(AGENT_DIR) does not exist, we don't build SA # also, we don't build SA on Itanium, PowerPC, ARM or zero. -all: +all: if [ -d $(AGENT_DIR) -a "$(SRCARCH)" != "ia64" \ -a "$(SRCARCH)" != "arm" \ -a "$(SRCARCH)" != "ppc" \ @@ -112,11 +112,11 @@ $(QUIETLY) $(REMOTE) $(COMPILE.RMIC) -classpath $(SA_CLASSDIR) -d $(SA_CLASSDIR) sun.jvm.hotspot.debugger.remote.RemoteDebuggerServer $(QUIETLY) echo "$(SA_BUILD_VERSION_PROP)" > $(SA_PROPERTIES) $(QUIETLY) rm -f $(SA_CLASSDIR)/sun/jvm/hotspot/utilities/soql/sa.js - $(QUIETLY) cp $(AGENT_SRC_DIR)/sun/jvm/hotspot/utilities/soql/sa.js $(SA_CLASSDIR)/sun/jvm/hotspot/utilities/soql + $(QUIETLY) $(CP) $(AGENT_SRC_DIR)/sun/jvm/hotspot/utilities/soql/sa.js $(SA_CLASSDIR)/sun/jvm/hotspot/utilities/soql $(QUIETLY) mkdir -p $(SA_CLASSDIR)/sun/jvm/hotspot/ui/resources $(QUIETLY) rm -f $(SA_CLASSDIR)/sun/jvm/hotspot/ui/resources/* - $(QUIETLY) cp $(AGENT_SRC_DIR)/sun/jvm/hotspot/ui/resources/*.png $(SA_CLASSDIR)/sun/jvm/hotspot/ui/resources/ - $(QUIETLY) cp -r $(AGENT_SRC_DIR)/images/* $(SA_CLASSDIR)/ + $(QUIETLY) $(CP) $(AGENT_SRC_DIR)/sun/jvm/hotspot/ui/resources/*.png $(SA_CLASSDIR)/sun/jvm/hotspot/ui/resources/ + $(QUIETLY) $(CP) -r $(AGENT_SRC_DIR)/images/* $(SA_CLASSDIR)/ $(QUIETLY) $(REMOTE) $(RUN.JAR) cf $@ -C $(SA_CLASSDIR)/ . $(QUIETLY) $(REMOTE) $(RUN.JAR) uf $@ -C $(AGENT_SRC_DIR) META-INF/services/com.sun.jdi.connect.Connector $(QUIETLY) $(REMOTE) $(RUN.JAVAH) -classpath $(SA_CLASSDIR) -d $(GENERATED) -jni sun.jvm.hotspot.debugger.x86.X86ThreadContext diff -r d553e7400295 -r 6c9ff31edda0 hotspot/make/bsd/makefiles/saproc.make --- a/hotspot/make/bsd/makefiles/saproc.make Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/make/bsd/makefiles/saproc.make Wed Jul 05 19:52:15 2017 +0200 @@ -19,7 +19,7 @@ # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions. -# +# # # Rules to build serviceability agent library, used by vm.make @@ -83,7 +83,7 @@ endif else SASRCFILES = $(SASRCDIR)/StubDebuggerLocal.c - SALIBS = + SALIBS = SAARCH = $(ARCHFLAG) endif endif @@ -163,13 +163,13 @@ @echo "Copying $(LIBSAPROC) to $(DEST_SAPROC)" ifeq ($(OS_VENDOR), Darwin) $(QUIETLY) test ! -d $(LIBSAPROC_DEBUGINFO) || \ - cp -f -r $(LIBSAPROC_DEBUGINFO) $(DEST_SAPROC_DEBUGINFO) + $(CP) -f -r $(LIBSAPROC_DEBUGINFO) $(DEST_SAPROC_DEBUGINFO) else $(QUIETLY) test ! -f $(LIBSAPROC_DEBUGINFO) || \ - cp -f $(LIBSAPROC_DEBUGINFO) $(DEST_SAPROC_DEBUGINFO) + $(CP) -f $(LIBSAPROC_DEBUGINFO) $(DEST_SAPROC_DEBUGINFO) endif $(QUIETLY) test ! -f $(LIBSAPROC_DIZ) || \ - cp -f $(LIBSAPROC_DIZ) $(DEST_SAPROC_DIZ) - $(QUIETLY) cp -f $(LIBSAPROC) $(DEST_SAPROC) && echo "Done" + $(CP) -f $(LIBSAPROC_DIZ) $(DEST_SAPROC_DIZ) + $(QUIETLY) $(CP) -f $(LIBSAPROC) $(DEST_SAPROC) && echo "Done" .PHONY: install_saproc diff -r d553e7400295 -r 6c9ff31edda0 hotspot/make/bsd/makefiles/top.make --- a/hotspot/make/bsd/makefiles/top.make Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/make/bsd/makefiles/top.make Wed Jul 05 19:52:15 2017 +0200 @@ -1,5 +1,5 @@ # -# Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -19,7 +19,7 @@ # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions. -# +# # # top.make is included in the Makefile in the build directories. @@ -45,10 +45,10 @@ GENERATED = $(TOPDIR)/../generated VM = $(GAMMADIR)/src/share/vm Plat_File = $(Platform_file) -CDG = cd $(GENERATED); +CDG = cd $(GENERATED); ifneq ($(USE_PRECOMPILED_HEADER),0) -UpdatePCH = $(MAKE) -f vm.make $(PRECOMPILED_HEADER) $(MFLAGS) +UpdatePCH = $(MAKE) -f vm.make $(PRECOMPILED_HEADER) $(MFLAGS) else UpdatePCH = \# precompiled header is not used endif @@ -84,7 +84,7 @@ @# We need a null action here, so implicit rules don't get consulted. $(Cached_plat): $(Plat_File) - $(CDG) cp $(Plat_File) $(Cached_plat) + $(CDG) $(CP) $(Plat_File) $(Cached_plat) # make AD files as necessary ad_stuff: $(Cached_plat) $(adjust-mflags) @@ -134,12 +134,12 @@ # next rules support "make foo.[ois]" %.o %.i %.s: - $(UpdatePCH) + $(UpdatePCH) $(MAKE) -f vm.make $(MFLAGS) $@ #$(MAKE) -f vm.make $@ # this should force everything to be rebuilt -clean: +clean: rm -f $(GENERATED)/*.class $(MAKE) -f vm.make $(MFLAGS) clean diff -r d553e7400295 -r 6c9ff31edda0 hotspot/make/bsd/makefiles/vm.make --- a/hotspot/make/bsd/makefiles/vm.make Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/make/bsd/makefiles/vm.make Wed Jul 05 19:52:15 2017 +0200 @@ -360,14 +360,14 @@ @echo "Copying $(LIBJVM) to $(DEST_JVM)" ifeq ($(OS_VENDOR), Darwin) $(QUIETLY) test ! -d $(LIBJVM_DEBUGINFO) || \ - cp -f -r $(LIBJVM_DEBUGINFO) $(DEST_JVM_DEBUGINFO) + $(CP) -f -r $(LIBJVM_DEBUGINFO) $(DEST_JVM_DEBUGINFO) else $(QUIETLY) test ! -f $(LIBJVM_DEBUGINFO) || \ - cp -f $(LIBJVM_DEBUGINFO) $(DEST_JVM_DEBUGINFO) + $(CP) -f $(LIBJVM_DEBUGINFO) $(DEST_JVM_DEBUGINFO) endif $(QUIETLY) test ! -f $(LIBJVM_DIZ) || \ - cp -f $(LIBJVM_DIZ) $(DEST_JVM_DIZ) - $(QUIETLY) cp -f $(LIBJVM) $(DEST_JVM) && echo "Done" + $(CP) -f $(LIBJVM_DIZ) $(DEST_JVM_DIZ) + $(QUIETLY) $(CP) -f $(LIBJVM) $(DEST_JVM) && echo "Done" #---------------------------------------------------------------------- # Other files diff -r d553e7400295 -r 6c9ff31edda0 hotspot/make/jprt.properties --- a/hotspot/make/jprt.properties Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/make/jprt.properties Wed Jul 05 19:52:15 2017 +0200 @@ -350,21 +350,25 @@ ${jprt.my.windows.i586}-fastdebug-c2-internalvmtests, \ ${jprt.my.windows.x64}-fastdebug-c2-internalvmtests -jprt.make.rule.test.targets.standard.wbapi = \ - ${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-wbapitest, \ - ${jprt.my.solaris.x64}-{product|fastdebug}-c2-wbapitest, \ - ${jprt.my.linux.i586}-{product|fastdebug}-c2-wbapitest, \ - ${jprt.my.linux.x64}-{product|fastdebug}-c2-wbapitest, \ - ${jprt.my.windows.i586}-{product|fastdebug}-c2-wbapitest, \ - ${jprt.my.windows.x64}-{product|fastdebug}-c2-wbapitest, \ - ${jprt.my.linux.i586}-{product|fastdebug}-c1-wbapitest, \ - ${jprt.my.windows.i586}-{product|fastdebug}-c1-wbapitest +jprt.make.rule.test.targets.standard.reg.group = \ + ${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-GROUP, \ + ${jprt.my.solaris.x64}-{product|fastdebug}-c2-GROUP, \ + ${jprt.my.linux.i586}-{product|fastdebug}-c2-GROUP, \ + ${jprt.my.linux.x64}-{product|fastdebug}-c2-GROUP, \ + ${jprt.my.windows.i586}-{product|fastdebug}-c2-GROUP, \ + ${jprt.my.windows.x64}-{product|fastdebug}-c2-GROUP, \ + ${jprt.my.linux.i586}-{product|fastdebug}-c1-GROUP, \ + ${jprt.my.windows.i586}-{product|fastdebug}-c1-GROUP jprt.make.rule.test.targets.standard = \ ${jprt.make.rule.test.targets.standard.client}, \ ${jprt.make.rule.test.targets.standard.server}, \ ${jprt.make.rule.test.targets.standard.internalvmtests}, \ - ${jprt.make.rule.test.targets.standard.wbapi} + ${jprt.make.rule.test.targets.standard.reg.group:GROUP=hotspot_wbapitest}, \ + ${jprt.make.rule.test.targets.standard.reg.group:GROUP=hotspot_compiler}, \ + ${jprt.make.rule.test.targets.standard.reg.group:GROUP=hotspot_gc}, \ + ${jprt.make.rule.test.targets.standard.reg.group:GROUP=hotspot_runtime}, \ + ${jprt.make.rule.test.targets.standard.reg.group:GROUP=hotspot_serviceability} jprt.make.rule.test.targets.embedded = \ ${jprt.make.rule.test.targets.standard.client} diff -r d553e7400295 -r 6c9ff31edda0 hotspot/make/linux/makefiles/buildtree.make --- a/hotspot/make/linux/makefiles/buildtree.make Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/make/linux/makefiles/buildtree.make Wed Jul 05 19:52:15 2017 +0200 @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -277,6 +277,8 @@ echo; \ [ -n "$(SPEC)" ] && \ echo "include $(SPEC)"; \ + echo "CP ?= cp"; \ + echo "MV ?= mv"; \ echo "include \$$(GAMMADIR)/make/$(OS_FAMILY)/makefiles/$(VARIANT).make"; \ echo "include \$$(GAMMADIR)/make/excludeSrc.make"; \ echo "include \$$(GAMMADIR)/make/$(OS_FAMILY)/makefiles/$(COMPILER).make"; \ diff -r d553e7400295 -r 6c9ff31edda0 hotspot/make/linux/makefiles/defs.make --- a/hotspot/make/linux/makefiles/defs.make Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/make/linux/makefiles/defs.make Wed Jul 05 19:52:15 2017 +0200 @@ -297,27 +297,23 @@ endif # Serviceability Binaries -# No SA Support for PPC, IA64, ARM or zero -ADD_SA_BINARIES/x86 = $(EXPORT_JRE_LIB_ARCH_DIR)/libsaproc.$(LIBRARY_SUFFIX) \ - $(EXPORT_LIB_DIR)/sa-jdi.jar -ADD_SA_BINARIES/sparc = $(EXPORT_JRE_LIB_ARCH_DIR)/libsaproc.$(LIBRARY_SUFFIX) \ - $(EXPORT_LIB_DIR)/sa-jdi.jar + +ADD_SA_BINARIES/DEFAULT = $(EXPORT_JRE_LIB_ARCH_DIR)/libsaproc.$(LIBRARY_SUFFIX) \ + $(EXPORT_LIB_DIR)/sa-jdi.jar + ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) ifeq ($(ZIP_DEBUGINFO_FILES),1) - ADD_SA_BINARIES/x86 += $(EXPORT_JRE_LIB_ARCH_DIR)/libsaproc.diz - ADD_SA_BINARIES/sparc += $(EXPORT_JRE_LIB_ARCH_DIR)/libsaproc.diz + ADD_SA_BINARIES/DEFAULT += $(EXPORT_JRE_LIB_ARCH_DIR)/libsaproc.diz else - ADD_SA_BINARIES/x86 += $(EXPORT_JRE_LIB_ARCH_DIR)/libsaproc.debuginfo - ADD_SA_BINARIES/sparc += $(EXPORT_JRE_LIB_ARCH_DIR)/libsaproc.debuginfo + ADD_SA_BINARIES/DEFAULT += $(EXPORT_JRE_LIB_ARCH_DIR)/libsaproc.debuginfo endif endif -ADD_SA_BINARIES/ppc = -ADD_SA_BINARIES/ia64 = -ADD_SA_BINARIES/arm = + +ADD_SA_BINARIES/$(HS_ARCH) = $(ADD_SA_BINARIES/DEFAULT) + +# No SA Support for zero ADD_SA_BINARIES/zero = -include $(HS_ALT_MAKE)/linux/makefiles/defs.make EXPORT_LIST += $(ADD_SA_BINARIES/$(HS_ARCH)) - - diff -r d553e7400295 -r 6c9ff31edda0 hotspot/make/linux/makefiles/jsig.make --- a/hotspot/make/linux/makefiles/jsig.make Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/make/linux/makefiles/jsig.make Wed Jul 05 19:52:15 2017 +0200 @@ -19,7 +19,7 @@ # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions. -# +# # # Rules to build signal interposition library, used by vm.make @@ -39,8 +39,8 @@ LIBJSIG_MAPFILE = $(MAKEFILES_DIR)/mapfile-vers-jsig -# On Linux we really dont want a mapfile, as this library is small -# and preloaded using LD_PRELOAD, making functions private will +# On Linux we really dont want a mapfile, as this library is small +# and preloaded using LD_PRELOAD, making functions private will # cause problems with interposing. See CR: 6466665 # LFLAGS_JSIG += $(MAPFLAG:FILENAME=$(LIBJSIG_MAPFILE)) @@ -75,9 +75,9 @@ install_jsig: $(LIBJSIG) @echo "Copying $(LIBJSIG) to $(DEST_JSIG)" $(QUIETLY) test ! -f $(LIBJSIG_DEBUGINFO) || \ - cp -f $(LIBJSIG_DEBUGINFO) $(DEST_JSIG_DEBUGINFO) + $(CP) -f $(LIBJSIG_DEBUGINFO) $(DEST_JSIG_DEBUGINFO) $(QUIETLY) test ! -f $(LIBJSIG_DIZ) || \ - cp -f $(LIBJSIG_DIZ) $(DEST_JSIG_DIZ) - $(QUIETLY) cp -f $(LIBJSIG) $(DEST_JSIG) && echo "Done" + $(CP) -f $(LIBJSIG_DIZ) $(DEST_JSIG_DIZ) + $(QUIETLY) $(CP) -f $(LIBJSIG) $(DEST_JSIG) && echo "Done" .PHONY: install_jsig diff -r d553e7400295 -r 6c9ff31edda0 hotspot/make/linux/makefiles/rules.make --- a/hotspot/make/linux/makefiles/rules.make Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/make/linux/makefiles/rules.make Wed Jul 05 19:52:15 2017 +0200 @@ -1,5 +1,5 @@ # -# Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -19,7 +19,7 @@ # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions. -# +# # # Common rules/macros for the vm, adlc. @@ -28,7 +28,7 @@ .SUFFIXES: .cpp $(SUFFIXES) DEMANGLER = c++filt -DEMANGLE = $(DEMANGLER) < $@ > .$@ && mv -f .$@ $@ +DEMANGLE = $(DEMANGLER) < $@ > .$@ && $(MV) -f .$@ $@ # $(CC) is the c compiler (cc/gcc), $(CXX) is the c++ compiler (CC/g++). CC_COMPILE = $(CC) $(CXXFLAGS) $(CFLAGS) diff -r d553e7400295 -r 6c9ff31edda0 hotspot/make/linux/makefiles/sa.make --- a/hotspot/make/linux/makefiles/sa.make Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/make/linux/makefiles/sa.make Wed Jul 05 19:52:15 2017 +0200 @@ -1,5 +1,5 @@ # -# Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -19,7 +19,7 @@ # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions. -# +# # # This makefile (sa.make) is included from the sa.make in the @@ -60,7 +60,7 @@ # if $(AGENT_DIR) does not exist, we don't build SA # also, we don't build SA on Itanium or zero. -all: +all: if [ -d $(AGENT_DIR) -a "$(SRCARCH)" != "ia64" \ -a "$(SRCARCH)" != "zero" ] ; then \ $(MAKE) -f sa.make $(GENERATED)/sa-jdi.jar; \ @@ -99,11 +99,11 @@ $(QUIETLY) $(REMOTE) $(COMPILE.RMIC) -classpath $(SA_CLASSDIR) -d $(SA_CLASSDIR) sun.jvm.hotspot.debugger.remote.RemoteDebuggerServer $(QUIETLY) echo "$(SA_BUILD_VERSION_PROP)" > $(SA_PROPERTIES) $(QUIETLY) rm -f $(SA_CLASSDIR)/sun/jvm/hotspot/utilities/soql/sa.js - $(QUIETLY) cp $(AGENT_SRC_DIR)/sun/jvm/hotspot/utilities/soql/sa.js $(SA_CLASSDIR)/sun/jvm/hotspot/utilities/soql + $(QUIETLY) $(CP) $(AGENT_SRC_DIR)/sun/jvm/hotspot/utilities/soql/sa.js $(SA_CLASSDIR)/sun/jvm/hotspot/utilities/soql $(QUIETLY) mkdir -p $(SA_CLASSDIR)/sun/jvm/hotspot/ui/resources $(QUIETLY) rm -f $(SA_CLASSDIR)/sun/jvm/hotspot/ui/resources/* - $(QUIETLY) cp $(AGENT_SRC_DIR)/sun/jvm/hotspot/ui/resources/*.png $(SA_CLASSDIR)/sun/jvm/hotspot/ui/resources/ - $(QUIETLY) cp -r $(AGENT_SRC_DIR)/images/* $(SA_CLASSDIR)/ + $(QUIETLY) $(CP) $(AGENT_SRC_DIR)/sun/jvm/hotspot/ui/resources/*.png $(SA_CLASSDIR)/sun/jvm/hotspot/ui/resources/ + $(QUIETLY) $(CP) -r $(AGENT_SRC_DIR)/images/* $(SA_CLASSDIR)/ $(QUIETLY) $(REMOTE) $(RUN.JAR) cf $@ -C $(SA_CLASSDIR)/ . $(QUIETLY) $(REMOTE) $(RUN.JAR) uf $@ -C $(AGENT_SRC_DIR) META-INF/services/com.sun.jdi.connect.Connector $(QUIETLY) $(REMOTE) $(RUN.JAVAH) -classpath $(SA_CLASSDIR) -d $(GENERATED) -jni sun.jvm.hotspot.debugger.x86.X86ThreadContext diff -r d553e7400295 -r 6c9ff31edda0 hotspot/make/linux/makefiles/saproc.make --- a/hotspot/make/linux/makefiles/saproc.make Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/make/linux/makefiles/saproc.make Wed Jul 05 19:52:15 2017 +0200 @@ -19,7 +19,7 @@ # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions. -# +# # include $(GAMMADIR)/make/defs.make include $(GAMMADIR)/make/altsrc.make @@ -116,10 +116,10 @@ $(QUIETLY) if [ -e $(LIBSAPROC) ] ; then \ echo "Copying $(LIBSAPROC) to $(DEST_SAPROC)"; \ test ! -f $(LIBSAPROC_DEBUGINFO) || \ - cp -f $(LIBSAPROC_DEBUGINFO) $(DEST_SAPROC_DEBUGINFO); \ + $(CP) -f $(LIBSAPROC_DEBUGINFO) $(DEST_SAPROC_DEBUGINFO); \ test ! -f $(LIBSAPROC_DIZ) || \ - cp -f $(LIBSAPROC_DIZ) $(DEST_SAPROC_DIZ); \ - cp -f $(LIBSAPROC) $(DEST_SAPROC) && echo "Done"; \ + $(CP) -f $(LIBSAPROC_DIZ) $(DEST_SAPROC_DIZ); \ + $(CP) -f $(LIBSAPROC) $(DEST_SAPROC) && echo "Done"; \ fi .PHONY: install_saproc diff -r d553e7400295 -r 6c9ff31edda0 hotspot/make/linux/makefiles/top.make --- a/hotspot/make/linux/makefiles/top.make Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/make/linux/makefiles/top.make Wed Jul 05 19:52:15 2017 +0200 @@ -1,5 +1,5 @@ # -# Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -19,7 +19,7 @@ # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions. -# +# # # top.make is included in the Makefile in the build directories. @@ -45,10 +45,10 @@ GENERATED = $(TOPDIR)/../generated VM = $(GAMMADIR)/src/share/vm Plat_File = $(Platform_file) -CDG = cd $(GENERATED); +CDG = cd $(GENERATED); ifneq ($(USE_PRECOMPILED_HEADER),0) -UpdatePCH = $(MAKE) -f vm.make $(PRECOMPILED_HEADER) $(MFLAGS) +UpdatePCH = $(MAKE) -f vm.make $(PRECOMPILED_HEADER) $(MFLAGS) else UpdatePCH = \# precompiled header is not used endif @@ -84,7 +84,7 @@ @# We need a null action here, so implicit rules don't get consulted. $(Cached_plat): $(Plat_File) - $(CDG) cp $(Plat_File) $(Cached_plat) + $(CDG) $(CP) $(Plat_File) $(Cached_plat) # make AD files as necessary ad_stuff: $(Cached_plat) $(adjust-mflags) @@ -128,12 +128,12 @@ # next rules support "make foo.[ois]" %.o %.i %.s: - $(UpdatePCH) + $(UpdatePCH) $(MAKE) -f vm.make $(MFLAGS) $@ #$(MAKE) -f vm.make $@ # this should force everything to be rebuilt -clean: +clean: rm -f $(GENERATED)/*.class $(MAKE) -f vm.make $(MFLAGS) clean diff -r d553e7400295 -r 6c9ff31edda0 hotspot/make/linux/makefiles/vm.make --- a/hotspot/make/linux/makefiles/vm.make Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/make/linux/makefiles/vm.make Wed Jul 05 19:52:15 2017 +0200 @@ -362,10 +362,10 @@ install_jvm: $(LIBJVM) @echo "Copying $(LIBJVM) to $(DEST_JVM)" $(QUIETLY) test ! -f $(LIBJVM_DEBUGINFO) || \ - cp -f $(LIBJVM_DEBUGINFO) $(DEST_JVM_DEBUGINFO) + $(CP) -f $(LIBJVM_DEBUGINFO) $(DEST_JVM_DEBUGINFO) $(QUIETLY) test ! -f $(LIBJVM_DIZ) || \ - cp -f $(LIBJVM_DIZ) $(DEST_JVM_DIZ) - $(QUIETLY) cp -f $(LIBJVM) $(DEST_JVM) && echo "Done" + $(CP) -f $(LIBJVM_DIZ) $(DEST_JVM_DIZ) + $(QUIETLY) $(CP) -f $(LIBJVM) $(DEST_JVM) && echo "Done" #---------------------------------------------------------------------- # Other files diff -r d553e7400295 -r 6c9ff31edda0 hotspot/make/solaris/makefiles/buildtree.make --- a/hotspot/make/solaris/makefiles/buildtree.make Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/make/solaris/makefiles/buildtree.make Wed Jul 05 19:52:15 2017 +0200 @@ -1,5 +1,5 @@ # -# Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -265,6 +265,8 @@ echo; \ [ -n "$(SPEC)" ] && \ echo "include $(SPEC)"; \ + echo "CP ?= cp"; \ + echo "MV ?= mv"; \ echo "include \$$(GAMMADIR)/make/$(OS_FAMILY)/makefiles/$(VARIANT).make"; \ echo "include \$$(GAMMADIR)/make/$(OS_FAMILY)/makefiles/$(COMPILER).make"; \ ) > $@ diff -r d553e7400295 -r 6c9ff31edda0 hotspot/make/solaris/makefiles/jsig.make --- a/hotspot/make/solaris/makefiles/jsig.make Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/make/solaris/makefiles/jsig.make Wed Jul 05 19:52:15 2017 +0200 @@ -19,7 +19,7 @@ # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions. -# +# # # Rules to build signal interposition library, used by vm.make @@ -80,9 +80,9 @@ install_jsig: $(LIBJSIG) @echo "Copying $(LIBJSIG) to $(DEST_JSIG)" $(QUIETLY) test ! -f $(LIBJSIG_DEBUGINFO) || \ - cp -f $(LIBJSIG_DEBUGINFO) $(DEST_JSIG_DEBUGINFO) + $(CP) -f $(LIBJSIG_DEBUGINFO) $(DEST_JSIG_DEBUGINFO) $(QUIETLY) test ! -f $(LIBJSIG_DIZ) || \ - cp -f $(LIBJSIG_DIZ) $(DEST_JSIG_DIZ) - $(QUIETLY) cp -f $(LIBJSIG) $(DEST_JSIG) && echo "Done" + $(CP) -f $(LIBJSIG_DIZ) $(DEST_JSIG_DIZ) + $(QUIETLY) $(CP) -f $(LIBJSIG) $(DEST_JSIG) && echo "Done" .PHONY: install_jsig diff -r d553e7400295 -r 6c9ff31edda0 hotspot/make/solaris/makefiles/rules.make --- a/hotspot/make/solaris/makefiles/rules.make Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/make/solaris/makefiles/rules.make Wed Jul 05 19:52:15 2017 +0200 @@ -1,5 +1,5 @@ # -# Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -19,7 +19,7 @@ # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions. -# +# # # Common rules/macros for the vm, adlc. @@ -28,7 +28,7 @@ .SUFFIXES: .cpp $(SUFFIXES) DEMANGLER = c++filt -DEMANGLE = $(DEMANGLER) < $@ > .$@ && mv -f .$@ $@ +DEMANGLE = $(DEMANGLER) < $@ > .$@ && $(MV) -f .$@ $@ # $(CC) is the c compiler (cc/gcc), $(CXX) is the c++ compiler (CC/g++). CC_COMPILE = $(CC) $(CXXFLAGS) $(CFLAGS) diff -r d553e7400295 -r 6c9ff31edda0 hotspot/make/solaris/makefiles/sa.make --- a/hotspot/make/solaris/makefiles/sa.make Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/make/solaris/makefiles/sa.make Wed Jul 05 19:52:15 2017 +0200 @@ -1,5 +1,5 @@ # -# Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -19,7 +19,7 @@ # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions. -# +# # # This makefile (sa.make) is included from the sa.make in the @@ -52,7 +52,7 @@ SA_PROPERTIES = $(SA_CLASSDIR)/sa.properties # if $(AGENT_DIR) does not exist, we don't build SA. -all: +all: $(QUIETLY) if [ -d $(AGENT_DIR) ] ; then \ $(MAKE) -f sa.make $(GENERATED)/sa-jdi.jar; \ fi @@ -90,11 +90,11 @@ $(QUIETLY) $(COMPILE.RMIC) -classpath $(SA_CLASSDIR) -d $(SA_CLASSDIR) sun.jvm.hotspot.debugger.remote.RemoteDebuggerServer $(QUIETLY) echo "$(SA_BUILD_VERSION_PROP)" > $(SA_PROPERTIES) $(QUIETLY) rm -f $(SA_CLASSDIR)/sun/jvm/hotspot/utilities/soql/sa.js - $(QUIETLY) cp $(AGENT_SRC_DIR)/sun/jvm/hotspot/utilities/soql/sa.js $(SA_CLASSDIR)/sun/jvm/hotspot/utilities/soql + $(QUIETLY) $(CP) $(AGENT_SRC_DIR)/sun/jvm/hotspot/utilities/soql/sa.js $(SA_CLASSDIR)/sun/jvm/hotspot/utilities/soql $(QUIETLY) mkdir -p $(SA_CLASSDIR)/sun/jvm/hotspot/ui/resources $(QUIETLY) rm -f $(SA_CLASSDIR)/sun/jvm/hotspot/ui/resources/* - $(QUIETLY) cp $(AGENT_SRC_DIR)/sun/jvm/hotspot/ui/resources/*.png $(SA_CLASSDIR)/sun/jvm/hotspot/ui/resources/ - $(QUIETLY) cp -r $(AGENT_SRC_DIR)/images/* $(SA_CLASSDIR)/ + $(QUIETLY) $(CP) $(AGENT_SRC_DIR)/sun/jvm/hotspot/ui/resources/*.png $(SA_CLASSDIR)/sun/jvm/hotspot/ui/resources/ + $(QUIETLY) $(CP) -r $(AGENT_SRC_DIR)/images/* $(SA_CLASSDIR)/ $(QUIETLY) $(RUN.JAR) cf $@ -C $(SA_CLASSDIR)/ . $(QUIETLY) $(RUN.JAR) uf $@ -C $(AGENT_SRC_DIR) META-INF/services/com.sun.jdi.connect.Connector $(QUIETLY) $(RUN.JAVAH) -classpath $(SA_CLASSDIR) -d $(GENERATED) -jni sun.jvm.hotspot.debugger.proc.ProcDebuggerLocal diff -r d553e7400295 -r 6c9ff31edda0 hotspot/make/solaris/makefiles/saproc.make --- a/hotspot/make/solaris/makefiles/saproc.make Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/make/solaris/makefiles/saproc.make Wed Jul 05 19:52:15 2017 +0200 @@ -19,7 +19,7 @@ # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions. -# +# # # Rules to build serviceability agent library, used by vm.make @@ -119,7 +119,7 @@ $(SOLARIS_11_B159_OR_LATER) \ $(SADISSRCFILES) \ -c -o $(SADISOBJ) - + ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) # gobjcopy crashes on "empty" section headers with the SHF_ALLOC flag set. # Clear the SHF_ALLOC flag (if set) from empty section headers. @@ -150,10 +150,10 @@ $(QUIETLY) if [ -f $(LIBSAPROC) ] ; then \ echo "Copying $(LIBSAPROC) to $(DEST_SAPROC)"; \ test ! -f $(LIBSAPROC_DEBUGINFO) || \ - cp -f $(LIBSAPROC_DEBUGINFO) $(DEST_SAPROC_DEBUGINFO); \ + $(CP) -f $(LIBSAPROC_DEBUGINFO) $(DEST_SAPROC_DEBUGINFO); \ test ! -f $(LIBSAPROC_DIZ) || \ - cp -f $(LIBSAPROC_DIZ) $(DEST_SAPROC_DIZ); \ - cp -f $(LIBSAPROC) $(DEST_SAPROC) && echo "Done"; \ + $(CP) -f $(LIBSAPROC_DIZ) $(DEST_SAPROC_DIZ); \ + $(CP) -f $(LIBSAPROC) $(DEST_SAPROC) && echo "Done"; \ fi .PHONY: install_saproc diff -r d553e7400295 -r 6c9ff31edda0 hotspot/make/solaris/makefiles/top.make --- a/hotspot/make/solaris/makefiles/top.make Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/make/solaris/makefiles/top.make Wed Jul 05 19:52:15 2017 +0200 @@ -1,5 +1,5 @@ # -# Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -19,7 +19,7 @@ # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions. -# +# # # top.make is included in the Makefile in the build directories. @@ -44,7 +44,7 @@ GENERATED = ../generated VM = $(GAMMADIR)/src/share/vm Plat_File = $(Platform_file) -CDG = cd $(GENERATED); +CDG = cd $(GENERATED); Cached_plat = $(GENERATED)/platform.current @@ -77,7 +77,7 @@ @# We need a null action here, so implicit rules don't get consulted. $(Cached_plat): $(Plat_File) - $(CDG) cp $(Plat_File) $(Cached_plat) + $(CDG) $(CP) $(Plat_File) $(Cached_plat) # make AD files as necessary ad_stuff: $(Cached_plat) $(adjust-mflags) @@ -87,7 +87,7 @@ jvmti_stuff: $(Cached_plat) $(adjust-mflags) @$(MAKE) -f jvmti.make $(MFLAGS-adjusted) -# generate trace files +# generate trace files trace_stuff: jvmti_stuff $(Cached_plat) $(adjust-mflags) @$(MAKE) -f trace.make $(MFLAGS-adjusted) @@ -124,7 +124,7 @@ #$(MAKE) -f vm.make $@ # this should force everything to be rebuilt -clean: +clean: rm -f $(GENERATED)/*.class $(MAKE) -f vm.make $(MFLAGS) clean diff -r d553e7400295 -r 6c9ff31edda0 hotspot/make/solaris/makefiles/vm.make --- a/hotspot/make/solaris/makefiles/vm.make Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/make/solaris/makefiles/vm.make Wed Jul 05 19:52:15 2017 +0200 @@ -336,10 +336,10 @@ install_jvm: $(LIBJVM) @echo "Copying $(LIBJVM) to $(DEST_JVM)" $(QUIETLY) test ! -f $(LIBJVM_DEBUGINFO) || \ - cp -f $(LIBJVM_DEBUGINFO) $(DEST_JVM_DEBUGINFO) + $(CP) -f $(LIBJVM_DEBUGINFO) $(DEST_JVM_DEBUGINFO) $(QUIETLY) test ! -f $(LIBJVM_DIZ) || \ - cp -f $(LIBJVM_DIZ) $(DEST_JVM_DIZ) - $(QUIETLY) cp -f $(LIBJVM) $(DEST_JVM) && echo "Done" + $(CP) -f $(LIBJVM_DIZ) $(DEST_JVM_DIZ) + $(QUIETLY) $(CP) -f $(LIBJVM) $(DEST_JVM) && echo "Done" #---------------------------------------------------------------------- # Other files diff -r d553e7400295 -r 6c9ff31edda0 hotspot/make/windows/build.make --- a/hotspot/make/windows/build.make Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/make/windows/build.make Wed Jul 05 19:52:15 2017 +0200 @@ -1,5 +1,5 @@ # -# Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -300,6 +300,8 @@ @ if "$(ENABLE_FULL_DEBUG_SYMBOLS)" NEQ "" echo ENABLE_FULL_DEBUG_SYMBOLS=$(ENABLE_FULL_DEBUG_SYMBOLS) >> $@ @ if "$(ZIP_DEBUGINFO_FILES)" NEQ "" echo ZIP_DEBUGINFO_FILES=$(ZIP_DEBUGINFO_FILES) >> $@ @ if "$(RM)" NEQ "" echo RM=$(RM) >> $@ + @ if "$(CP)" NEQ "" echo CP=$(CP) >> $@ + @ if "$(MV)" NEQ "" echo MV=$(MV) >> $@ @ if "$(ZIPEXE)" NEQ "" echo ZIPEXE=$(ZIPEXE) >> $@ checks: checkVariant checkWorkSpace checkSA diff -r d553e7400295 -r 6c9ff31edda0 hotspot/make/windows/makefiles/defs.make --- a/hotspot/make/windows/makefiles/defs.make Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/make/windows/makefiles/defs.make Wed Jul 05 19:52:15 2017 +0200 @@ -1,5 +1,5 @@ # -# Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2006, 2014, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -156,6 +156,9 @@ MAKE_ARGS += RM="$(RM)" MAKE_ARGS += ZIPEXE=$(ZIPEXE) +MAKE_ARGS += CP="${CP}" +MAKE_ARGS += MV="${MV}" + # On 32 bit windows we build server and client, on 64 bit just server. ifeq ($(JVM_VARIANTS),) diff -r d553e7400295 -r 6c9ff31edda0 hotspot/make/windows/makefiles/sa.make --- a/hotspot/make/windows/makefiles/sa.make Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/make/windows/makefiles/sa.make Wed Jul 05 19:52:15 2017 +0200 @@ -19,7 +19,7 @@ # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions. -# +# # # This makefile is used to build Serviceability Agent code @@ -76,16 +76,16 @@ $(COMPILE_RMIC) -classpath $(SA_CLASSDIR) -d $(SA_CLASSDIR) sun.jvm.hotspot.debugger.remote.RemoteDebuggerServer $(QUIETLY) echo $(SA_BUILD_VERSION_PROP)> $(SA_PROPERTIES) $(QUIETLY) rm -f $(SA_CLASSDIR)/sun/jvm/hotspot/utilities/soql/sa.js - $(QUIETLY) cp $(AGENT_SRC_DIR)/sun/jvm/hotspot/utilities/soql/sa.js $(SA_CLASSDIR)/sun/jvm/hotspot/utilities/soql + $(QUIETLY) $(CP) $(AGENT_SRC_DIR)/sun/jvm/hotspot/utilities/soql/sa.js $(SA_CLASSDIR)/sun/jvm/hotspot/utilities/soql $(QUIETLY) rm -rf $(SA_CLASSDIR)/sun/jvm/hotspot/ui/resources $(QUIETLY) mkdir $(SA_CLASSDIR)/sun/jvm/hotspot/ui/resources - $(QUIETLY) cp $(AGENT_SRC_DIR)/sun/jvm/hotspot/ui/resources/*.png $(SA_CLASSDIR)/sun/jvm/hotspot/ui/resources - $(QUIETLY) cp -r $(AGENT_SRC_DIR)/images/* $(SA_CLASSDIR) + $(QUIETLY) $(CP) $(AGENT_SRC_DIR)/sun/jvm/hotspot/ui/resources/*.png $(SA_CLASSDIR)/sun/jvm/hotspot/ui/resources + $(QUIETLY) $(CP) -r $(AGENT_SRC_DIR)/images/* $(SA_CLASSDIR) $(RUN_JAR) cf $@ -C $(SA_CLASSDIR) . $(RUN_JAR) uf $@ -C $(AGENT_SRC_DIR) META-INF/services/com.sun.jdi.connect.Connector $(RUN_JAVAH) -classpath $(SA_CLASSDIR) -jni sun.jvm.hotspot.debugger.windbg.WindbgDebuggerLocal - $(RUN_JAVAH) -classpath $(SA_CLASSDIR) -jni sun.jvm.hotspot.debugger.x86.X86ThreadContext - $(RUN_JAVAH) -classpath $(SA_CLASSDIR) -jni sun.jvm.hotspot.debugger.amd64.AMD64ThreadContext + $(RUN_JAVAH) -classpath $(SA_CLASSDIR) -jni sun.jvm.hotspot.debugger.x86.X86ThreadContext + $(RUN_JAVAH) -classpath $(SA_CLASSDIR) -jni sun.jvm.hotspot.debugger.amd64.AMD64ThreadContext $(RUN_JAVAH) -classpath $(SA_CLASSDIR) -jni sun.jvm.hotspot.asm.Disassembler @@ -105,7 +105,7 @@ !elseif "$(BUILDARCH)" == "amd64" SA_CFLAGS = -nologo $(MS_RUNTIME_OPTION) -W3 $(GX_OPTION) -Od -D "WIN32" -D "WIN64" -D "_WINDOWS" -D "_DEBUG" -D "_CONSOLE" -D "_MBCS" -FD -c !else -SA_CFLAGS = -nologo $(MS_RUNTIME_OPTION) -W3 $(GX_OPTION) -Od -D "WIN32" -D "_WINDOWS" -D "_DEBUG" -D "_CONSOLE" -D "_MBCS" -FD -RTC1 -c +SA_CFLAGS = -nologo $(MS_RUNTIME_OPTION) -W3 $(GX_OPTION) -Od -D "WIN32" -D "_WINDOWS" -D "_DEBUG" -D "_CONSOLE" -D "_MBCS" -FD -RTC1 -c !if "$(ENABLE_FULL_DEBUG_SYMBOLS)" == "1" SA_CFLAGS = $(SA_CFLAGS) -ZI !endif @@ -116,7 +116,7 @@ SASRCFILES = $(AGENT_DIR)/src/os/win32/windbg/sawindbg.cpp \ $(AGENT_DIR)/src/share/native/sadis.c - + SA_LFLAGS = $(SA_LD_FLAGS) -nologo -subsystem:console -machine:$(MACHINE) !if "$(ENABLE_FULL_DEBUG_SYMBOLS)" == "1" SA_LFLAGS = $(SA_LFLAGS) -map -debug @@ -136,7 +136,7 @@ $(SAWINDBG): $(SASRCFILES) set INCLUDE=$(SA_INCLUDE)$(INCLUDE) $(CXX) @<< - -I"$(BootStrapDir)/include" -I"$(BootStrapDir)/include/win32" + -I"$(BootStrapDir)/include" -I"$(BootStrapDir)/include/win32" -I"$(GENERATED)" $(SA_CFLAGS) $(SASRCFILES) -out:$*.obj diff -r d553e7400295 -r 6c9ff31edda0 hotspot/src/cpu/sparc/vm/vm_version_sparc.cpp --- a/hotspot/src/cpu/sparc/vm/vm_version_sparc.cpp Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/src/cpu/sparc/vm/vm_version_sparc.cpp Wed Jul 05 19:52:15 2017 +0200 @@ -251,6 +251,49 @@ // buf is started with ", " or is empty _features_str = strdup(strlen(buf) > 2 ? buf + 2 : buf); + // There are three 64-bit SPARC families that do not overlap, e.g., + // both is_ultra3() and is_sparc64() cannot be true at the same time. + // Within these families, there can be more than one chip, e.g., + // is_T4() and is_T7() machines are also is_niagara(). + if (is_ultra3()) { + assert(_L1_data_cache_line_size == 0, "overlap with Ultra3 family"); + // Ref: UltraSPARC III Cu Processor + _L1_data_cache_line_size = 64; + } + if (is_niagara()) { + assert(_L1_data_cache_line_size == 0, "overlap with niagara family"); + // All Niagara's are sun4v's, but not all sun4v's are Niagaras, e.g., + // Fujitsu SPARC64 is sun4v, but we don't want it in this block. + // + // Ref: UltraSPARC T1 Supplement to the UltraSPARC Architecture 2005 + // Appendix F.1.3.1 Cacheable Accesses + // -> 16-byte L1 cache line size + // + // Ref: UltraSPARC T2: A Highly-Threaded, Power-Efficient, SPARC SOC + // Section III: SPARC Processor Core + // -> 16-byte L1 cache line size + // + // Ref: Oracle's SPARC T4-1, SPARC T4-2, SPARC T4-4, and SPARC T4-1B Server Architecture + // Section SPARC T4 Processor Cache Architecture + // -> 32-byte L1 cache line size (no longer see that info on this ref) + // + // XXX - still need a T7 reference here + // + if (is_T7()) { // T7 or newer + _L1_data_cache_line_size = 64; + } else if (is_T4()) { // T4 or newer (until T7) + _L1_data_cache_line_size = 32; + } else { // T1 or newer (until T4) + _L1_data_cache_line_size = 16; + } + } + if (is_sparc64()) { + guarantee(_L1_data_cache_line_size == 0, "overlap with SPARC64 family"); + // Ref: Fujitsu SPARC64 VII Processor + // Section 4 Cache System + _L1_data_cache_line_size = 64; + } + // UseVIS is set to the smallest of what hardware supports and what // the command line requires. I.e., you cannot set UseVIS to 3 on // older UltraSparc which do not support it. @@ -356,6 +399,7 @@ #ifndef PRODUCT if (PrintMiscellaneous && Verbose) { + tty->print_cr("L1 data cache line size: %u", L1_data_cache_line_size()); tty->print("Allocation"); if (AllocatePrefetchStyle <= 0) { tty->print_cr(": no prefetching"); diff -r d553e7400295 -r 6c9ff31edda0 hotspot/src/cpu/x86/vm/vm_version_x86.cpp --- a/hotspot/src/cpu/x86/vm/vm_version_x86.cpp Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/src/cpu/x86/vm/vm_version_x86.cpp Wed Jul 05 19:52:15 2017 +0200 @@ -394,6 +394,8 @@ _stepping = 0; _cpuFeatures = 0; _logical_processors_per_package = 1; + // i486 internal cache is both I&D and has a 16-byte line size + _L1_data_cache_line_size = 16; if (!Use486InstrsOnly) { // Get raw processor info @@ -412,6 +414,7 @@ // Logical processors are only available on P4s and above, // and only if hyperthreading is available. _logical_processors_per_package = logical_processor_count(); + _L1_data_cache_line_size = L1_line_size(); } } @@ -924,6 +927,7 @@ if (PrintMiscellaneous && Verbose) { tty->print_cr("Logical CPUs per core: %u", logical_processors_per_package()); + tty->print_cr("L1 data cache line size: %u", L1_data_cache_line_size()); tty->print("UseSSE=%d", (int) UseSSE); if (UseAVX > 0) { tty->print(" UseAVX=%d", (int) UseAVX); diff -r d553e7400295 -r 6c9ff31edda0 hotspot/src/cpu/x86/vm/vm_version_x86.hpp --- a/hotspot/src/cpu/x86/vm/vm_version_x86.hpp Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/src/cpu/x86/vm/vm_version_x86.hpp Wed Jul 05 19:52:15 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -581,7 +581,7 @@ return result; } - static intx prefetch_data_size() { + static intx L1_line_size() { intx result = 0; if (is_intel()) { result = (_cpuid_info.dcp_cpuid4_ebx.bits.L1_line_size + 1); @@ -593,6 +593,10 @@ return result; } + static intx prefetch_data_size() { + return L1_line_size(); + } + // // Feature identification // diff -r d553e7400295 -r 6c9ff31edda0 hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/LogParser.java --- a/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/LogParser.java Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/LogParser.java Wed Jul 05 19:52:15 2017 +0200 @@ -478,9 +478,17 @@ } else if (scopes.peek().getCalls().size() > 2 && m == scopes.peek().last(-2).getMethod()) { scopes.push(scopes.peek().last(-2)); } else { - System.out.println(site.getMethod()); - System.out.println(m); - throw new InternalError("call site and parse don't match"); + // C1 prints multiple method tags during inlining when it narrows method being inlinied. + // Example: + // ... + // + // + // + // + // + // ... + site.setMethod(m); + scopes.push(site); } } } else if (qname.equals("parse_done")) { diff -r d553e7400295 -r 6c9ff31edda0 hotspot/src/share/vm/c1/c1_GraphBuilder.cpp --- a/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp Wed Jul 05 19:52:15 2017 +0200 @@ -1573,6 +1573,7 @@ default: constant = new Constant(as_ValueType(field_val)); } + // Stable static fields are checked for non-default values in ciField::initialize_from(). } if (constant != NULL) { push(type, append(constant)); @@ -1614,6 +1615,10 @@ default: constant = new Constant(as_ValueType(field_val)); } + if (FoldStableValues && field->is_stable() && field_val.is_null_or_zero()) { + // Stable field with default value can't be constant. + constant = NULL; + } } else { // For CallSite objects treat the target field as a compile time constant. if (const_oop->is_call_site()) { @@ -3959,10 +3964,15 @@ // Clear out bytecode stream scope_data()->set_stream(NULL); + CompileLog* log = compilation()->log(); + if (log != NULL) log->head("parse method='%d'", log->identify(callee)); + // Ready to resume parsing in callee (either in the same block we // were in before or in the callee's start block) iterate_all_blocks(callee_start_block == NULL); + if (log != NULL) log->done("parse"); + // If we bailed out during parsing, return immediately (this is bad news) if (bailed_out()) return false; diff -r d553e7400295 -r 6c9ff31edda0 hotspot/src/share/vm/ci/ciEnv.cpp --- a/hotspot/src/share/vm/ci/ciEnv.cpp Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/src/share/vm/ci/ciEnv.cpp Wed Jul 05 19:52:15 2017 +0200 @@ -1125,9 +1125,6 @@ // ------------------------------------------------------------------ // ciEnv::record_failure() void ciEnv::record_failure(const char* reason) { - if (log() != NULL) { - log()->elem("failure reason='%s'", reason); - } if (_failure_reason == NULL) { // Record the first failure reason. _failure_reason = reason; diff -r d553e7400295 -r 6c9ff31edda0 hotspot/src/share/vm/classfile/classLoaderData.cpp --- a/hotspot/src/share/vm/classfile/classLoaderData.cpp Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/src/share/vm/classfile/classLoaderData.cpp Wed Jul 05 19:52:15 2017 +0200 @@ -777,11 +777,22 @@ // unneeded entries. bool has_redefined_a_class = JvmtiExport::has_redefined_a_class(); MetadataOnStackMark md_on_stack; + if (has_redefined_a_class) { + // purge_previous_versions also cleans weak method links. Because + // one method's MDO can reference another method from another + // class loader, we need to first clean weak method links for all + // class loaders here. Below, we can then free redefined methods + // for all class loaders. + while (data != NULL) { + if (data->is_alive(is_alive_closure)) { + data->classes_do(InstanceKlass::purge_previous_versions); + } + data = data->next(); + } + } + data = _head; while (data != NULL) { if (data->is_alive(is_alive_closure)) { - if (has_redefined_a_class) { - data->classes_do(InstanceKlass::purge_previous_versions); - } data->free_deallocate_list(); prev = data; data = data->next(); diff -r d553e7400295 -r 6c9ff31edda0 hotspot/src/share/vm/classfile/javaClasses.cpp --- a/hotspot/src/share/vm/classfile/javaClasses.cpp Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/src/share/vm/classfile/javaClasses.cpp Wed Jul 05 19:52:15 2017 +0200 @@ -1239,6 +1239,16 @@ } +// Return Symbol for detailed_message or NULL +Symbol* java_lang_Throwable::detail_message(oop throwable) { + PRESERVE_EXCEPTION_MARK; // Keep original exception + oop detailed_message = java_lang_Throwable::message(throwable); + if (detailed_message != NULL) { + return java_lang_String::as_symbol(detailed_message, THREAD); + } + return NULL; +} + void java_lang_Throwable::set_message(oop throwable, oop value) { throwable->obj_field_put(detailMessage_offset, value); } diff -r d553e7400295 -r 6c9ff31edda0 hotspot/src/share/vm/classfile/javaClasses.hpp --- a/hotspot/src/share/vm/classfile/javaClasses.hpp Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/src/share/vm/classfile/javaClasses.hpp Wed Jul 05 19:52:15 2017 +0200 @@ -520,6 +520,7 @@ static oop message(oop throwable); static oop message(Handle throwable); static void set_message(oop throwable, oop value); + static Symbol* detail_message(oop throwable); static void print_stack_element(outputStream *st, Handle mirror, int method, int version, int bci); static void print_stack_element(outputStream *st, methodHandle method, int bci); diff -r d553e7400295 -r 6c9ff31edda0 hotspot/src/share/vm/compiler/compileBroker.cpp --- a/hotspot/src/share/vm/compiler/compileBroker.cpp Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/src/share/vm/compiler/compileBroker.cpp Wed Jul 05 19:52:15 2017 +0200 @@ -297,6 +297,7 @@ _hot_count = hot_count; _time_queued = 0; // tidy _comment = comment; + _failure_reason = NULL; if (LogCompilation) { _time_queued = os::elapsed_counter(); @@ -566,6 +567,11 @@ methodHandle method(thread, this->method()); ResourceMark rm(thread); + if (!_is_success) { + const char* reason = _failure_reason != NULL ? _failure_reason : "unknown"; + log->elem("failure reason='%s'", reason); + } + // nmethod* nm = code(); log->begin_elem("task_done success='%d' nmsize='%d' count='%d'", @@ -733,6 +739,7 @@ for (CompileTask* task = head; task != NULL; ) { CompileTask* next_task = task->next(); CompileTaskWrapper ctw(task); // Frees the task + task->set_failure_reason("stale task"); task = next_task; } } @@ -1786,6 +1793,7 @@ } else { // After compilation is disabled, remove remaining methods from queue method->clear_queued_for_compilation(); + task->set_failure_reason("compilation is disabled"); } } } @@ -1973,6 +1981,7 @@ compilable = ci_env.compilable(); if (ci_env.failing()) { + task->set_failure_reason(ci_env.failure_reason()); const char* retry_message = ci_env.retry_message(); if (_compilation_log != NULL) { _compilation_log->log_failure(thread, task, ci_env.failure_reason(), retry_message); diff -r d553e7400295 -r 6c9ff31edda0 hotspot/src/share/vm/compiler/compileBroker.hpp --- a/hotspot/src/share/vm/compiler/compileBroker.hpp Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/src/share/vm/compiler/compileBroker.hpp Wed Jul 05 19:52:15 2017 +0200 @@ -64,6 +64,7 @@ jobject _hot_method_holder; int _hot_count; // information about its invocation counter const char* _comment; // more info about the task + const char* _failure_reason; public: CompileTask() { @@ -138,6 +139,10 @@ void log_task_queued(); void log_task_start(CompileLog* log); void log_task_done(CompileLog* log); + + void set_failure_reason(const char* reason) { + _failure_reason = reason; + } }; // CompilerCounters diff -r d553e7400295 -r 6c9ff31edda0 hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.cpp --- a/hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.cpp Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.cpp Wed Jul 05 19:52:15 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -197,28 +197,29 @@ bool VM_CollectForMetadataAllocation::initiate_concurrent_GC() { #if INCLUDE_ALL_GCS - if (UseConcMarkSweepGC || UseG1GC) { - if (UseConcMarkSweepGC && CMSClassUnloadingEnabled) { - MetaspaceGC::set_should_concurrent_collect(true); - } else if (UseG1GC) { - G1CollectedHeap* g1h = G1CollectedHeap::heap(); - g1h->g1_policy()->set_initiate_conc_mark_if_possible(); + if (UseConcMarkSweepGC && CMSClassUnloadingEnabled) { + MetaspaceGC::set_should_concurrent_collect(true); + return true; + } - GCCauseSetter x(g1h, _gc_cause); + if (UseG1GC) { + G1CollectedHeap* g1h = G1CollectedHeap::heap(); + g1h->g1_policy()->set_initiate_conc_mark_if_possible(); - // At this point we are supposed to start a concurrent cycle. We - // will do so if one is not already in progress. - bool should_start = g1h->g1_policy()->force_initial_mark_if_outside_cycle(_gc_cause); + GCCauseSetter x(g1h, _gc_cause); - if (should_start) { - double pause_target = g1h->g1_policy()->max_pause_time_ms(); - g1h->do_collection_pause_at_safepoint(pause_target); - } + // At this point we are supposed to start a concurrent cycle. We + // will do so if one is not already in progress. + bool should_start = g1h->g1_policy()->force_initial_mark_if_outside_cycle(_gc_cause); + + if (should_start) { + double pause_target = g1h->g1_policy()->max_pause_time_ms(); + g1h->do_collection_pause_at_safepoint(pause_target); } - return true; } #endif + return false; } diff -r d553e7400295 -r 6c9ff31edda0 hotspot/src/share/vm/interpreter/interpreterRuntime.cpp --- a/hotspot/src/share/vm/interpreter/interpreterRuntime.cpp Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/src/share/vm/interpreter/interpreterRuntime.cpp Wed Jul 05 19:52:15 2017 +0200 @@ -430,9 +430,18 @@ // tracing if (TraceExceptions) { - ttyLocker ttyl; ResourceMark rm(thread); - tty->print_cr("Exception <%s> (" INTPTR_FORMAT ")", h_exception->print_value_string(), (address)h_exception()); + Symbol* message = java_lang_Throwable::detail_message(h_exception()); + ttyLocker ttyl; // Lock after getting the detail message + if (message != NULL) { + tty->print_cr("Exception <%s: %s> (" INTPTR_FORMAT ")", + h_exception->print_value_string(), message->as_C_string(), + (address)h_exception()); + } else { + tty->print_cr("Exception <%s> (" INTPTR_FORMAT ")", + h_exception->print_value_string(), + (address)h_exception()); + } tty->print_cr(" thrown in interpreter method <%s>", h_method->print_value_string()); tty->print_cr(" at bci %d for thread " INTPTR_FORMAT, current_bci, thread); } diff -r d553e7400295 -r 6c9ff31edda0 hotspot/src/share/vm/interpreter/oopMapCache.cpp --- a/hotspot/src/share/vm/interpreter/oopMapCache.cpp Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/src/share/vm/interpreter/oopMapCache.cpp Wed Jul 05 19:52:15 2017 +0200 @@ -244,10 +244,8 @@ method()->print_value(); tty->print(" @ %d = [%d] { ", bci(), n); for (int i = 0; i < n; i++) { -#ifdef ENABLE_ZAP_DEAD_LOCALS if (is_dead(i)) tty->print("%d+ ", i); else -#endif if (is_oop(i)) tty->print("%d ", i); } tty->print_cr("}"); @@ -402,13 +400,11 @@ value |= (mask << oop_bit_number ); } - #ifdef ENABLE_ZAP_DEAD_LOCALS // set dead bit if (!cell->is_live()) { value |= (mask << dead_bit_number); assert(!cell->is_reference(), "dead value marked as oop"); } - #endif } // make sure last word is stored diff -r d553e7400295 -r 6c9ff31edda0 hotspot/src/share/vm/interpreter/oopMapCache.hpp --- a/hotspot/src/share/vm/interpreter/oopMapCache.hpp Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/src/share/vm/interpreter/oopMapCache.hpp Wed Jul 05 19:52:15 2017 +0200 @@ -66,19 +66,15 @@ public: enum { - N = 2, // the number of words reserved + N = 4, // the number of words reserved // for inlined mask storage small_mask_limit = N * BitsPerWord, // the maximum number of bits // available for small masks, // small_mask_limit can be set to 0 // for testing bit_mask allocation -#ifdef ENABLE_ZAP_DEAD_LOCALS bits_per_entry = 2, dead_bit_number = 1, -#else - bits_per_entry = 1, -#endif oop_bit_number = 0 }; @@ -119,10 +115,6 @@ void set_expression_stack_size(int sz) { _expression_stack_size = sz; } -#ifdef ENABLE_ZAP_DEAD_LOCALS - bool is_dead(int offset) const { return (entry_at(offset) & (1 << dead_bit_number)) != 0; } -#endif - // Lookup bool match(methodHandle method, int bci) const { return _method == method() && _bci == bci; } bool is_empty() const; @@ -144,6 +136,7 @@ void print() const; int number_of_entries() const { return mask_size() / bits_per_entry; } + bool is_dead(int offset) const { return (entry_at(offset) & (1 << dead_bit_number)) != 0; } bool is_oop (int offset) const { return (entry_at(offset) & (1 << oop_bit_number )) != 0; } int expression_stack_size() const { return _expression_stack_size; } diff -r d553e7400295 -r 6c9ff31edda0 hotspot/src/share/vm/oops/constantPool.cpp --- a/hotspot/src/share/vm/oops/constantPool.cpp Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/src/share/vm/oops/constantPool.cpp Wed Jul 05 19:52:15 2017 +0200 @@ -520,13 +520,9 @@ Symbol* ConstantPool::exception_message(constantPoolHandle this_cp, int which, constantTag tag, oop pending_exception) { // Dig out the detailed message to reuse if possible - Symbol* message = NULL; - oop detailed_message = java_lang_Throwable::message(pending_exception); - if (detailed_message != NULL) { - message = java_lang_String::as_symbol_or_null(detailed_message); - if (message != NULL) { - return message; - } + Symbol* message = java_lang_Throwable::detail_message(pending_exception); + if (message != NULL) { + return message; } // Return specific message for the tag diff -r d553e7400295 -r 6c9ff31edda0 hotspot/src/share/vm/oops/method.cpp --- a/hotspot/src/share/vm/oops/method.cpp Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/src/share/vm/oops/method.cpp Wed Jul 05 19:52:15 2017 +0200 @@ -729,8 +729,8 @@ } if ((TraceDeoptimization || LogCompilation) && (xtty != NULL)) { ttyLocker ttyl; - xtty->begin_elem("make_not_%scompilable thread='" UINTX_FORMAT "'", - is_osr ? "osr_" : "", os::current_thread_id()); + xtty->begin_elem("make_not_compilable thread='" UINTX_FORMAT "' osr='%d' level='%d'", + os::current_thread_id(), is_osr, comp_level); if (reason != NULL) { xtty->print(" reason=\'%s\'", reason); } diff -r d553e7400295 -r 6c9ff31edda0 hotspot/src/share/vm/oops/methodData.cpp --- a/hotspot/src/share/vm/oops/methodData.cpp Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/src/share/vm/oops/methodData.cpp Wed Jul 05 19:52:15 2017 +0200 @@ -1556,7 +1556,7 @@ public: CleanExtraDataMethodClosure() {} bool is_live(Method* m) { - return m->on_stack(); + return !m->is_old() || m->on_stack(); } }; diff -r d553e7400295 -r 6c9ff31edda0 hotspot/src/share/vm/opto/bytecodeInfo.cpp --- a/hotspot/src/share/vm/opto/bytecodeInfo.cpp Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/src/share/vm/opto/bytecodeInfo.cpp Wed Jul 05 19:52:15 2017 +0200 @@ -107,7 +107,7 @@ int caller_bci, ciCallProfile& profile, WarmCallInfo* wci_result) { // Allows targeted inlining - if(callee_method->should_inline()) { + if (callee_method->should_inline()) { *wci_result = *(WarmCallInfo::always_hot()); if (C->print_inlining() && Verbose) { CompileTask::print_inline_indent(inline_level()); @@ -118,6 +118,12 @@ return true; } + if (callee_method->force_inline()) { + set_msg("force inline by annotation"); + _forced_inline = true; + return true; + } + #ifndef PRODUCT int inline_depth = inline_level()+1; if (ciReplay::should_inline(C->replay_inline_data(), callee_method, caller_bci, inline_depth)) { @@ -244,6 +250,11 @@ } #endif + if (callee_method->force_inline()) { + set_msg("force inline by annotation"); + return false; + } + // Now perform checks which are heuristic if (is_unboxing_method(callee_method, C)) { @@ -251,12 +262,10 @@ return false; } - if (!callee_method->force_inline()) { - if (callee_method->has_compiled_code() && - callee_method->instructions_size() > InlineSmallCode) { - set_msg("already compiled into a big method"); - return true; - } + if (callee_method->has_compiled_code() && + callee_method->instructions_size() > InlineSmallCode) { + set_msg("already compiled into a big method"); + return true; } // don't inline exception code unless the top method belongs to an @@ -349,7 +358,7 @@ // Escape Analysis stress testing when running Xcomp or CTW: // inline constructors even if they are not reached. } else if (forced_inline()) { - // Inlining was forced by CompilerOracle or ciReplay + // Inlining was forced by CompilerOracle, ciReplay or annotation } else if (profile.count() == 0) { // don't inline unreached call sites set_msg("call site not reached"); diff -r d553e7400295 -r 6c9ff31edda0 hotspot/src/share/vm/opto/machnode.cpp --- a/hotspot/src/share/vm/opto/machnode.cpp Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/src/share/vm/opto/machnode.cpp Wed Jul 05 19:52:15 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -639,7 +639,6 @@ } #endif - bool MachCallNode::return_value_is_used() const { if (tf()->range()->cnt() == TypeFunc::Parms) { // void return @@ -657,6 +656,14 @@ return false; } +// Similar to cousin class CallNode::returns_pointer +// Because this is used in deoptimization, we want the type info, not the data +// flow info; the interpreter will "use" things that are dead to the optimizer. +bool MachCallNode::returns_pointer() const { + const TypeTuple *r = tf()->range(); + return (r->cnt() > TypeFunc::Parms && + r->field_at(TypeFunc::Parms)->isa_ptr()); +} //------------------------------Registers-------------------------------------- const RegMask &MachCallNode::in_RegMask(uint idx) const { diff -r d553e7400295 -r 6c9ff31edda0 hotspot/src/share/vm/opto/machnode.hpp --- a/hotspot/src/share/vm/opto/machnode.hpp Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/src/share/vm/opto/machnode.hpp Wed Jul 05 19:52:15 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -842,6 +842,10 @@ bool returns_long() const { return tf()->return_type() == T_LONG; } bool return_value_is_used() const; + + // Similar to cousin class CallNode::returns_pointer + bool returns_pointer() const; + #ifndef PRODUCT virtual void dump_spec(outputStream *st) const; #endif diff -r d553e7400295 -r 6c9ff31edda0 hotspot/src/share/vm/opto/output.cpp --- a/hotspot/src/share/vm/opto/output.cpp Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/src/share/vm/opto/output.cpp Wed Jul 05 19:52:15 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -854,8 +854,7 @@ } // Check if a call returns an object. - if (mcall->return_value_is_used() && - mcall->tf()->range()->field_at(TypeFunc::Parms)->isa_ptr()) { + if (mcall->returns_pointer()) { return_oop = true; } safepoint_pc_offset += mcall->ret_addr_offset(); diff -r d553e7400295 -r 6c9ff31edda0 hotspot/src/share/vm/opto/parse.hpp --- a/hotspot/src/share/vm/opto/parse.hpp Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/src/share/vm/opto/parse.hpp Wed Jul 05 19:52:15 2017 +0200 @@ -142,7 +142,7 @@ void print_value_on(outputStream* st) const PRODUCT_RETURN; - bool _forced_inline; // Inlining was forced by CompilerOracle or ciReplay + bool _forced_inline; // Inlining was forced by CompilerOracle, ciReplay or annotation bool forced_inline() const { return _forced_inline; } // Count number of nodes in this subtree int count() const; diff -r d553e7400295 -r 6c9ff31edda0 hotspot/src/share/vm/opto/replacednodes.cpp --- a/hotspot/src/share/vm/opto/replacednodes.cpp Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/src/share/vm/opto/replacednodes.cpp Wed Jul 05 19:52:15 2017 +0200 @@ -185,11 +185,11 @@ void ReplacedNodes::dump(outputStream *st) const { if (!is_empty()) { - tty->print("replaced nodes: "); + st->print("replaced nodes: "); for (int i = 0; i < _replaced_nodes->length(); i++) { - tty->print("%d->%d", _replaced_nodes->at(i).initial()->_idx, _replaced_nodes->at(i).improved()->_idx); + st->print("%d->%d", _replaced_nodes->at(i).initial()->_idx, _replaced_nodes->at(i).improved()->_idx); if (i < _replaced_nodes->length()-1) { - tty->print(","); + st->print(","); } } } diff -r d553e7400295 -r 6c9ff31edda0 hotspot/src/share/vm/prims/jni.cpp --- a/hotspot/src/share/vm/prims/jni.cpp Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/src/share/vm/prims/jni.cpp Wed Jul 05 19:52:15 2017 +0200 @@ -247,15 +247,6 @@ "Bug in native code: jfieldID offset must address interior of object"); } -// Pick a reasonable higher bound for local capacity requested -// for EnsureLocalCapacity and PushLocalFrame. We don't want it too -// high because a test (or very unusual application) may try to allocate -// that many handles and run out of swap space. An implementation is -// permitted to allocate more handles than the ensured capacity, so this -// value is set high enough to prevent compatibility problems. -const int MAX_REASONABLE_LOCAL_CAPACITY = 4*K; - - // Wrapper to trace JNI functions #ifdef ASSERT @@ -741,7 +732,8 @@ HOTSPOT_JNI_PUSHLOCALFRAME_ENTRY(env, capacity); //%note jni_11 - if (capacity < 0 || capacity > MAX_REASONABLE_LOCAL_CAPACITY) { + if (capacity < 0 || + ((MaxJNILocalCapacity > 0) && (capacity > MaxJNILocalCapacity))) { HOTSPOT_JNI_PUSHLOCALFRAME_RETURN((uint32_t)JNI_ERR); return JNI_ERR; } @@ -844,7 +836,8 @@ HOTSPOT_JNI_ENSURELOCALCAPACITY_ENTRY(env, capacity); jint ret; - if (capacity >= 0 && capacity <= MAX_REASONABLE_LOCAL_CAPACITY) { + if (capacity >= 0 && + ((MaxJNILocalCapacity <= 0) || (capacity <= MaxJNILocalCapacity))) { ret = JNI_OK; } else { ret = JNI_ERR; @@ -3893,6 +3886,7 @@ run_unit_test(TestKlass_test()); run_unit_test(TestBitMap_test()); run_unit_test(TestAsUtf8()); + run_unit_test(ObjectMonitor::sanity_checks()); #if INCLUDE_VM_STRUCTS run_unit_test(VMStructs::test()); #endif diff -r d553e7400295 -r 6c9ff31edda0 hotspot/src/share/vm/prims/jniCheck.cpp --- a/hotspot/src/share/vm/prims/jniCheck.cpp Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/src/share/vm/prims/jniCheck.cpp Wed Jul 05 19:52:15 2017 +0200 @@ -185,6 +185,9 @@ * throw an ArrayIndexOutOfBoundsException or ArrayStoreException. * * In all other cases, a non-error return value guarantees that no exceptions have been thrown. + * + * Programmers often defend against ArrayIndexOutOfBoundsException, so warning + * for these functions would be pedantic. */ static inline void check_pending_exception(JavaThread* thr) { @@ -201,6 +204,16 @@ } } +/** + * Add to the planned number of handles. I.e. plus current live & warning threshold + */ +static inline void +add_planned_handle_capacity(JNIHandleBlock* handles, size_t capacity) { + handles->set_planned_capacity(capacity + + handles->get_number_of_live_handles() + + CHECK_JNI_LOCAL_REF_CAP_WARN_THRESHOLD); +} + static inline void functionEnterCritical(JavaThread* thr) @@ -243,7 +256,7 @@ thr->print_stack(); ) // Complain just the once, reset to current + warn threshold - handles->set_planned_capacity(live_handles + CHECK_JNI_LOCAL_REF_CAP_WARN_THRESHOLD); + add_planned_handle_capacity(handles, 0); } } @@ -720,7 +733,7 @@ NativeReportJNIFatalError(thr, "negative capacity"); jint result = UNCHECKED()->PushLocalFrame(env, capacity); if (result == JNI_OK) { - thr->active_handles()->set_planned_capacity(capacity + CHECK_JNI_LOCAL_REF_CAP_WARN_THRESHOLD); + add_planned_handle_capacity(thr->active_handles(), capacity); } functionExit(thr); return result; @@ -824,7 +837,7 @@ } jint result = UNCHECKED()->EnsureLocalCapacity(env, capacity); if (result == JNI_OK) { - thr->active_handles()->set_planned_capacity(capacity + CHECK_JNI_LOCAL_REF_CAP_WARN_THRESHOLD); + add_planned_handle_capacity(thr->active_handles(), capacity); } functionExit(thr); return result; @@ -1628,7 +1641,6 @@ check_is_obj_array(thr, array); ) jobject result = UNCHECKED()->GetObjectArrayElement(env,array,index); - thr->set_pending_jni_exception_check("GetObjectArrayElement"); functionExit(thr); return result; JNI_END @@ -1643,7 +1655,6 @@ check_is_obj_array(thr, array); ) UNCHECKED()->SetObjectArrayElement(env,array,index,val); - thr->set_pending_jni_exception_check("SetObjectArrayElement"); functionExit(thr); JNI_END @@ -1733,7 +1744,6 @@ check_primitive_array_type(thr, array, ElementTag); \ ) \ UNCHECKED()->Get##Result##ArrayRegion(env,array,start,len,buf); \ - thr->set_pending_jni_exception_check("Get"#Result"ArrayRegion"); \ functionExit(thr); \ JNI_END @@ -1758,7 +1768,6 @@ check_primitive_array_type(thr, array, ElementTag); \ ) \ UNCHECKED()->Set##Result##ArrayRegion(env,array,start,len,buf); \ - thr->set_pending_jni_exception_check("Set"#Result"ArrayRegion"); \ functionExit(thr); \ JNI_END @@ -1835,7 +1844,6 @@ checkString(thr, str); ) UNCHECKED()->GetStringRegion(env, str, start, len, buf); - thr->set_pending_jni_exception_check("GetStringRegion"); functionExit(thr); JNI_END @@ -1850,7 +1858,6 @@ checkString(thr, str); ) UNCHECKED()->GetStringUTFRegion(env, str, start, len, buf); - thr->set_pending_jni_exception_check("GetStringUTFRegion"); functionExit(thr); JNI_END diff -r d553e7400295 -r 6c9ff31edda0 hotspot/src/share/vm/prims/jvmtiImpl.cpp --- a/hotspot/src/share/vm/prims/jvmtiImpl.cpp Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/src/share/vm/prims/jvmtiImpl.cpp Wed Jul 05 19:52:15 2017 +0200 @@ -25,6 +25,7 @@ #include "precompiled.hpp" #include "classfile/systemDictionary.hpp" #include "interpreter/interpreter.hpp" +#include "interpreter/oopMapCache.hpp" #include "jvmtifiles/jvmtiEnv.hpp" #include "memory/resourceArea.hpp" #include "oops/instanceKlass.hpp" @@ -744,6 +745,13 @@ } void VM_GetOrSetLocal::doit() { + InterpreterOopMap oop_mask; + _jvf->method()->mask_for(_jvf->bci(), &oop_mask); + if (oop_mask.is_dead(_index)) { + // The local can be invalid and uninitialized in the scope of current bci + _result = JVMTI_ERROR_INVALID_SLOT; + return; + } if (_set) { // Force deoptimization of frame if compiled because it's // possible the compiler emitted some locals as constant values, diff -r d553e7400295 -r 6c9ff31edda0 hotspot/src/share/vm/runtime/atomic.hpp --- a/hotspot/src/share/vm/runtime/atomic.hpp Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/src/share/vm/runtime/atomic.hpp Wed Jul 05 19:52:15 2017 +0200 @@ -35,6 +35,18 @@ // can provide an alternative action if not - see supports_cx8() for // a means to test availability. + // The memory operations that are mentioned with each of the atomic + // function families come from src/share/vm/runtime/orderAccess.hpp, + // e.g., is described in that file and is implemented by the + // OrderAccess::fence() function. See that file for the gory details + // on the Memory Access Ordering Model. + + // All of the atomic operations that imply a read-modify-write action + // guarantee a two-way memory barrier across that operation. Historically + // these semantics reflect the strength of atomic operations that are + // provided on SPARC/X86. We assume that strength is necessary unless + // we can prove that a weaker form is sufficiently safe. + // Atomically store to a location inline static void store (jbyte store_value, jbyte* dest); inline static void store (jshort store_value, jshort* dest); @@ -55,7 +67,8 @@ // See comment above about using jlong atomics on 32-bit platforms inline static jlong load(volatile jlong* src); - // Atomically add to a location, return updated value + // Atomically add to a location. Returns updated value. add*() provide: + // add-value-to-dest inline static jint add (jint add_value, volatile jint* dest); inline static size_t add (size_t add_value, volatile size_t* dest); inline static intptr_t add_ptr(intptr_t add_value, volatile intptr_t* dest); @@ -63,30 +76,35 @@ // See comment above about using jlong atomics on 32-bit platforms static jlong add (jlong add_value, volatile jlong* dest); - // Atomically increment location + // Atomically increment location. inc*() provide: + // increment-dest inline static void inc (volatile jint* dest); static void inc (volatile jshort* dest); inline static void inc (volatile size_t* dest); inline static void inc_ptr(volatile intptr_t* dest); inline static void inc_ptr(volatile void* dest); - // Atomically decrement a location + // Atomically decrement a location. dec*() provide: + // decrement-dest inline static void dec (volatile jint* dest); static void dec (volatile jshort* dest); inline static void dec (volatile size_t* dest); inline static void dec_ptr(volatile intptr_t* dest); inline static void dec_ptr(volatile void* dest); - // Performs atomic exchange of *dest with exchange_value. Returns old prior value of *dest. + // Performs atomic exchange of *dest with exchange_value. Returns old + // prior value of *dest. xchg*() provide: + // exchange-value-with-dest inline static jint xchg(jint exchange_value, volatile jint* dest); static unsigned int xchg(unsigned int exchange_value, volatile unsigned int* dest); inline static intptr_t xchg_ptr(intptr_t exchange_value, volatile intptr_t* dest); inline static void* xchg_ptr(void* exchange_value, volatile void* dest); - // Performs atomic compare of *dest and compare_value, and exchanges *dest with exchange_value - // if the comparison succeeded. Returns prior value of *dest. Guarantees a two-way memory - // barrier across the cmpxchg. I.e., it's really a 'fence_cmpxchg_acquire'. + // Performs atomic compare of *dest and compare_value, and exchanges + // *dest with exchange_value if the comparison succeeded. Returns prior + // value of *dest. cmpxchg*() provide: + // compare-and-exchange static jbyte cmpxchg (jbyte exchange_value, volatile jbyte* dest, jbyte compare_value); inline static jint cmpxchg (jint exchange_value, volatile jint* dest, jint compare_value); // See comment above about using jlong atomics on 32-bit platforms diff -r d553e7400295 -r 6c9ff31edda0 hotspot/src/share/vm/runtime/globals.hpp --- a/hotspot/src/share/vm/runtime/globals.hpp Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/src/share/vm/runtime/globals.hpp Wed Jul 05 19:52:15 2017 +0200 @@ -1216,6 +1216,11 @@ product(bool, UseFastJNIAccessors, true, \ "Use optimized versions of GetField") \ \ + product(intx, MaxJNILocalCapacity, 65536, \ + "Maximum allowable local JNI handle capacity to " \ + "EnsureLocalCapacity() and PushLocalFrame(), " \ + "where <= 0 is unlimited, default: 65536") \ + \ product(bool, EagerXrunInit, false, \ "Eagerly initialize -Xrun libraries; allows startup profiling, " \ "but not all -Xrun libraries may support the state of the VM " \ diff -r d553e7400295 -r 6c9ff31edda0 hotspot/src/share/vm/runtime/objectMonitor.cpp --- a/hotspot/src/share/vm/runtime/objectMonitor.cpp Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/src/share/vm/runtime/objectMonitor.cpp Wed Jul 05 19:52:15 2017 +0200 @@ -2497,6 +2497,10 @@ SETKNOB(FastHSSEC); #undef SETKNOB + if (Knob_Verbose) { + sanity_checks(); + } + if (os::is_MP()) { BackOffMask = (1 << Knob_SpinBackOff) - 1; if (Knob_ReportSettings) ::printf("BackOffMask=%X\n", BackOffMask); @@ -2517,6 +2521,66 @@ InitDone = 1; } +void ObjectMonitor::sanity_checks() { + int error_cnt = 0; + int warning_cnt = 0; + bool verbose = Knob_Verbose != 0 NOT_PRODUCT(|| VerboseInternalVMTests); + + if (verbose) { + tty->print_cr("INFO: sizeof(ObjectMonitor)=" SIZE_FORMAT, + sizeof(ObjectMonitor)); + } + + uint cache_line_size = VM_Version::L1_data_cache_line_size(); + if (verbose) { + tty->print_cr("INFO: L1_data_cache_line_size=%u", cache_line_size); + } + + ObjectMonitor dummy; + u_char *addr_begin = (u_char*)&dummy; + u_char *addr_header = (u_char*)&dummy._header; + u_char *addr_owner = (u_char*)&dummy._owner; + + uint offset_header = (uint)(addr_header - addr_begin); + if (verbose) tty->print_cr("INFO: offset(_header)=%u", offset_header); + + uint offset_owner = (uint)(addr_owner - addr_begin); + if (verbose) tty->print_cr("INFO: offset(_owner)=%u", offset_owner); + + if ((uint)(addr_header - addr_begin) != 0) { + tty->print_cr("ERROR: offset(_header) must be zero (0)."); + error_cnt++; + } + + if (cache_line_size != 0) { + // We were able to determine the L1 data cache line size so + // do some cache line specific sanity checks + + if ((offset_owner - offset_header) < cache_line_size) { + tty->print_cr("WARNING: the _header and _owner fields are closer " + "than a cache line which permits false sharing."); + warning_cnt++; + } + + if ((sizeof(ObjectMonitor) % cache_line_size) != 0) { + tty->print_cr("WARNING: ObjectMonitor size is not a multiple of " + "a cache line which permits false sharing."); + warning_cnt++; + } + } + + ObjectSynchronizer::sanity_checks(verbose, cache_line_size, &error_cnt, + &warning_cnt); + + if (verbose || error_cnt != 0 || warning_cnt != 0) { + tty->print_cr("INFO: error_cnt=%d", error_cnt); + tty->print_cr("INFO: warning_cnt=%d", warning_cnt); + } + + guarantee(error_cnt == 0, + "Fatal error(s) found in ObjectMonitor::sanity_checks()"); +} + #ifndef PRODUCT void ObjectMonitor::verify() { } diff -r d553e7400295 -r 6c9ff31edda0 hotspot/src/share/vm/runtime/objectMonitor.hpp --- a/hotspot/src/share/vm/runtime/objectMonitor.hpp Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/src/share/vm/runtime/objectMonitor.hpp Wed Jul 05 19:52:15 2017 +0200 @@ -189,6 +189,8 @@ bool check(TRAPS); // true if the thread owns the monitor. void check_slow(TRAPS); void clear(); + static void sanity_checks(); // public for -XX:+ExecuteInternalVMTests + // in PRODUCT for -XX:SyncKnobs=Verbose=1 #ifndef PRODUCT void verify(); void print(); @@ -234,8 +236,6 @@ // WARNING: this must be the very first word of ObjectMonitor // This means this class can't use any virtual member functions. - // TODO-FIXME: assert that offsetof(_header) is 0 or get rid of the - // implicit 0 offset in emitted code. volatile markOop _header; // displaced object header word - mark void* volatile _object; // backward object pointer - strong root diff -r d553e7400295 -r 6c9ff31edda0 hotspot/src/share/vm/runtime/synchronizer.cpp --- a/hotspot/src/share/vm/runtime/synchronizer.cpp Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/src/share/vm/runtime/synchronizer.cpp Wed Jul 05 19:52:15 2017 +0200 @@ -392,19 +392,22 @@ // Hash Code handling // // Performance concern: -// OrderAccess::storestore() calls release() which STs 0 into the global volatile -// OrderAccess::Dummy variable. This store is unnecessary for correctness. -// Many threads STing into a common location causes considerable cache migration -// or "sloshing" on large SMP system. As such, I avoid using OrderAccess::storestore() -// until it's repaired. In some cases OrderAccess::fence() -- which incurs local -// latency on the executing processor -- is a better choice as it scales on SMP -// systems. See http://blogs.sun.com/dave/entry/biased_locking_in_hotspot for a -// discussion of coherency costs. Note that all our current reference platforms -// provide strong ST-ST order, so the issue is moot on IA32, x64, and SPARC. +// OrderAccess::storestore() calls release() which at one time stored 0 +// into the global volatile OrderAccess::dummy variable. This store was +// unnecessary for correctness. Many threads storing into a common location +// causes considerable cache migration or "sloshing" on large SMP systems. +// As such, I avoided using OrderAccess::storestore(). In some cases +// OrderAccess::fence() -- which incurs local latency on the executing +// processor -- is a better choice as it scales on SMP systems. +// +// See http://blogs.oracle.com/dave/entry/biased_locking_in_hotspot for +// a discussion of coherency costs. Note that all our current reference +// platforms provide strong ST-ST order, so the issue is moot on IA32, +// x64, and SPARC. // // As a general policy we use "volatile" to control compiler-based reordering -// and explicit fences (barriers) to control for architectural reordering performed -// by the CPU(s) or platform. +// and explicit fences (barriers) to control for architectural reordering +// performed by the CPU(s) or platform. struct SharedGlobals { // These are highly shared mostly-read variables. @@ -1596,7 +1599,55 @@ } //------------------------------------------------------------------------------ -// Non-product code +// Debugging code + +void ObjectSynchronizer::sanity_checks(const bool verbose, + const uint cache_line_size, + int *error_cnt_ptr, + int *warning_cnt_ptr) { + u_char *addr_begin = (u_char*)&GVars; + u_char *addr_stwRandom = (u_char*)&GVars.stwRandom; + u_char *addr_hcSequence = (u_char*)&GVars.hcSequence; + + if (verbose) { + tty->print_cr("INFO: sizeof(SharedGlobals)=" SIZE_FORMAT, + sizeof(SharedGlobals)); + } + + uint offset_stwRandom = (uint)(addr_stwRandom - addr_begin); + if (verbose) tty->print_cr("INFO: offset(stwRandom)=%u", offset_stwRandom); + + uint offset_hcSequence = (uint)(addr_hcSequence - addr_begin); + if (verbose) { + tty->print_cr("INFO: offset(_hcSequence)=%u", offset_hcSequence); + } + + if (cache_line_size != 0) { + // We were able to determine the L1 data cache line size so + // do some cache line specific sanity checks + + if (offset_stwRandom < cache_line_size) { + tty->print_cr("WARNING: the SharedGlobals.stwRandom field is closer " + "to the struct beginning than a cache line which permits " + "false sharing."); + (*warning_cnt_ptr)++; + } + + if ((offset_hcSequence - offset_stwRandom) < cache_line_size) { + tty->print_cr("WARNING: the SharedGlobals.stwRandom and " + "SharedGlobals.hcSequence fields are closer than a cache " + "line which permits false sharing."); + (*warning_cnt_ptr)++; + } + + if ((sizeof(SharedGlobals) - offset_hcSequence) < cache_line_size) { + tty->print_cr("WARNING: the SharedGlobals.hcSequence field is closer " + "to the struct end than a cache line which permits false " + "sharing."); + (*warning_cnt_ptr)++; + } + } +} #ifndef PRODUCT diff -r d553e7400295 -r 6c9ff31edda0 hotspot/src/share/vm/runtime/synchronizer.hpp --- a/hotspot/src/share/vm/runtime/synchronizer.hpp Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/src/share/vm/runtime/synchronizer.hpp Wed Jul 05 19:52:15 2017 +0200 @@ -121,6 +121,9 @@ static void oops_do(OopClosure* f); // debugging + static void sanity_checks(const bool verbose, + const unsigned int cache_line_size, + int *error_cnt_ptr, int *warning_cnt_ptr); static void verify() PRODUCT_RETURN; static int verify_objmon_isinpool(ObjectMonitor *addr) PRODUCT_RETURN0; diff -r d553e7400295 -r 6c9ff31edda0 hotspot/src/share/vm/runtime/vm_version.cpp --- a/hotspot/src/share/vm/runtime/vm_version.cpp Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/src/share/vm/runtime/vm_version.cpp Wed Jul 05 19:52:15 2017 +0200 @@ -50,6 +50,7 @@ bool Abstract_VM_Version::_supports_atomic_getadd4 = false; bool Abstract_VM_Version::_supports_atomic_getadd8 = false; unsigned int Abstract_VM_Version::_logical_processors_per_package = 1U; +unsigned int Abstract_VM_Version::_L1_data_cache_line_size = 0; int Abstract_VM_Version::_reserve_for_allocation_prefetch = 0; #ifndef HOTSPOT_RELEASE_VERSION diff -r d553e7400295 -r 6c9ff31edda0 hotspot/src/share/vm/runtime/vm_version.hpp --- a/hotspot/src/share/vm/runtime/vm_version.hpp Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/src/share/vm/runtime/vm_version.hpp Wed Jul 05 19:52:15 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -42,6 +42,7 @@ static bool _supports_atomic_getadd4; static bool _supports_atomic_getadd8; static unsigned int _logical_processors_per_package; + static unsigned int _L1_data_cache_line_size; static int _vm_major_version; static int _vm_minor_version; static int _vm_micro_version; @@ -98,6 +99,10 @@ return _logical_processors_per_package; } + static unsigned int L1_data_cache_line_size() { + return _L1_data_cache_line_size; + } + // Need a space at the end of TLAB for prefetch instructions // which may fault when accessing memory outside of heap. static int reserve_for_allocation_prefetch() { diff -r d553e7400295 -r 6c9ff31edda0 hotspot/test/Makefile --- a/hotspot/test/Makefile Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/test/Makefile Wed Jul 05 19:52:15 2017 +0200 @@ -23,14 +23,36 @@ # # -# Makefile to run various jdk tests +# Makefile to run various hotspot tests # GETMIXEDPATH=echo -# Get OS/ARCH specifics -OSNAME = $(shell uname -s) -ifeq ($(OSNAME), SunOS) +# Utilities used +AWK = awk +CAT = cat +CD = cd +CHMOD = chmod +CP = cp +CUT = cut +DIRNAME = dirname +ECHO = echo +EGREP = egrep +EXPAND = expand +FIND = find +MKDIR = mkdir +PWD = pwd +SED = sed +SORT = sort +TEE = tee +UNAME = uname +UNIQ = uniq +WC = wc +ZIP = zip + +# Get OS name from uname (Cygwin inexplicably adds _NT-5.1) +UNAME_S := $(shell $(UNAME) -s | $(CUT) -f1 -d_) +ifeq ($(UNAME_S), SunOS) PLATFORM = solaris SLASH_JAVA = /java ARCH = $(shell uname -p) @@ -38,7 +60,7 @@ ARCH=i586 endif endif -ifeq ($(OSNAME), Linux) +ifeq ($(UNAME_S), Linux) PLATFORM = linux SLASH_JAVA = /java ARCH = $(shell uname -m) @@ -46,7 +68,7 @@ ARCH = i586 endif endif -ifeq ($(OSNAME), Darwin) +ifeq ($(UNAME_S), Darwin) PLATFORM = bsd SLASH_JAVA = /java ARCH = $(shell uname -m) @@ -54,7 +76,7 @@ ARCH = i586 endif endif -ifeq ($(findstring BSD,$(OSNAME)), BSD) +ifeq ($(findstring BSD,$(UNAME_S)), BSD) PLATFORM = bsd SLASH_JAVA = /java ARCH = $(shell uname -m) @@ -63,12 +85,12 @@ endif endif ifeq ($(PLATFORM),) - # detect wether we're running in MKS or cygwin - ifeq ($(OSNAME), Windows_NT) # MKS + # detect whether we're running in MKS or cygwin + ifeq ($(UNAME_S), Windows_NT) # MKS GETMIXEDPATH=dosname -s endif - ifeq ($(findstring CYGWIN,$(OSNAME)), CYGWIN) - GETMIXEDPATH=cygpath -m -s + ifeq ($(findstring CYGWIN,$(UNAME_S)), CYGWIN) + GETMIXEDPATH=cygpath -m endif PLATFORM = windows SLASH_JAVA = J: @@ -92,13 +114,6 @@ SLASH_JAVA = $(ALT_SLASH_JAVA) endif -# Utilities used -CD = cd -CP = cp -ECHO = echo -MKDIR = mkdir -ZIP = zip - # Root of this test area (important to use full paths in some places) TEST_ROOT := $(shell pwd) @@ -136,21 +151,82 @@ endif # How to create the test bundle (pass or fail, we want to create this) -BUNDLE_UP = ( $(MKDIR) -p `dirname $(ARCHIVE_BUNDLE)` \ - && $(CD) $(ABS_TEST_OUTPUT_DIR) \ - && $(ZIP) -q -r $(ARCHIVE_BUNDLE) . ) -BUNDLE_UP_FAILED = ( exitCode=$$? && $(BUNDLE_UP) && exit $${exitCode} ) +# Follow command with ";$(BUNDLE_UP_AND_EXIT)", so it always gets executed. +ZIP_UP_RESULTS = ( $(MKDIR) -p `$(DIRNAME) $(ARCHIVE_BUNDLE)` \ + && $(CD) $(ABS_TEST_OUTPUT_DIR) \ + && $(CHMOD) -R a+r . \ + && $(ZIP) -q -r $(ARCHIVE_BUNDLE) . ) + +# important results files +SUMMARY_TXT = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/JTreport/text/summary.txt") +STATS_TXT_NAME = Stats.txt +STATS_TXT = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/$(STATS_TXT_NAME)") +RUNLIST = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/runlist.txt") +PASSLIST = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/passlist.txt") +FAILLIST = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/faillist.txt") +EXITCODE = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/exitcode.txt") + +TESTEXIT = \ + if [ ! -s $(EXITCODE) ] ; then \ + $(ECHO) "ERROR: EXITCODE file not filled in."; \ + $(ECHO) "1" > $(EXITCODE); \ + fi ; \ + testExitCode=`$(CAT) $(EXITCODE)`; \ + $(ECHO) "EXIT CODE: $${testExitCode}"; \ + exit $${testExitCode} + +BUNDLE_UP_AND_EXIT = \ +( \ + jtregExitCode=$$? && \ + _summary="$(SUMMARY_TXT)"; \ + $(RM) -f $(STATS_TXT) $(RUNLIST) $(PASSLIST) $(FAILLIST) $(EXITCODE); \ + $(ECHO) "$${jtregExitCode}" > $(EXITCODE); \ + if [ -r "$${_summary}" ] ; then \ + $(ECHO) "Summary: $(UNIQUE_DIR)" > $(STATS_TXT); \ + $(EXPAND) $${_summary} | $(EGREP) -v ' Not run\.' > $(RUNLIST); \ + $(EGREP) ' Passed\.' $(RUNLIST) \ + | $(EGREP) -v ' Error\.' \ + | $(EGREP) -v ' Failed\.' > $(PASSLIST); \ + ( $(EGREP) ' Failed\.' $(RUNLIST); \ + $(EGREP) ' Error\.' $(RUNLIST); \ + $(EGREP) -v ' Passed\.' $(RUNLIST) ) \ + | $(SORT) | $(UNIQ) > $(FAILLIST); \ + if [ $${jtregExitCode} != 0 -o -s $(FAILLIST) ] ; then \ + $(EXPAND) $(FAILLIST) \ + | $(CUT) -d' ' -f1 \ + | $(SED) -e 's@^@FAILED: @' >> $(STATS_TXT); \ + if [ $${jtregExitCode} = 0 ] ; then \ + jtregExitCode=1; \ + fi; \ + fi; \ + runc="`$(CAT) $(RUNLIST) | $(WC) -l | $(AWK) '{print $$1;}'`"; \ + passc="`$(CAT) $(PASSLIST) | $(WC) -l | $(AWK) '{print $$1;}'`"; \ + failc="`$(CAT) $(FAILLIST) | $(WC) -l | $(AWK) '{print $$1;}'`"; \ + exclc="FIXME CODETOOLS-7900176"; \ + $(ECHO) "TEST STATS: name=$(UNIQUE_DIR) run=$${runc} pass=$${passc} fail=$${failc}" \ + >> $(STATS_TXT); \ + else \ + $(ECHO) "Missing file: $${_summary}" >> $(STATS_TXT); \ + fi; \ + if [ -f $(STATS_TXT) ] ; then \ + $(CAT) $(STATS_TXT); \ + fi; \ + $(ZIP_UP_RESULTS) ; \ + $(TESTEXIT) \ +) ################################################################ # Default make rule (runs jtreg_tests) -all: jtreg_tests +all: hotspot_all @$(ECHO) "Testing completed successfully" -# Support "hotspot_" prefixed test make targets too -# The hotspot_% targets are for example invoked by the top level Makefile +# Support "hotspot_" prefixed test make targets (too) +# The hotspot_% targets are used by the top level Makefile +# Unless explicitly defined below, hotspot_ is interpreted as a jtreg test group name hotspot_%: - $(MAKE) $* + $(ECHO) "Running tests: $@" + $(MAKE) -j 1 TEST_SELECTION=":$@" UNIQUE_DIR=$@ jtreg_tests; # Prep for output prep: clean @@ -168,41 +244,64 @@ # Expect JT_HOME to be set for jtreg tests. (home for jtreg) ifndef JT_HOME - JT_HOME = $(SLASH_JAVA)/re/jtreg/4.0/promoted/latest/binaries/jtreg -endif -ifdef JPRT_JTREG_HOME - JT_HOME = $(JPRT_JTREG_HOME) + JT_HOME = $(SLASH_JAVA)/re/jtreg/4.1/promoted/latest/binaries/jtreg + ifdef JPRT_JTREG_HOME + JT_HOME = $(JPRT_JTREG_HOME) + endif endif -# Expect JPRT to set TESTDIRS to the jtreg test dirs -JTREG_TESTDIRS = demo/jvmti/gctest demo/jvmti/hprof +# When called from JPRT the TESTDIRS variable is set to the jtreg tests to run ifdef TESTDIRS - JTREG_TESTDIRS = $(TESTDIRS) + TEST_SELECTION = $(TESTDIRS) +endif + +ifdef CONCURRENCY + EXTRA_JTREG_OPTIONS += -concurrency:$(CONCURRENCY) endif # Default JTREG to run (win32 script works for everybody) JTREG = $(JT_HOME)/win32/bin/jtreg +# Only run automatic tests +JTREG_BASIC_OPTIONS += -a +# Report details on all failed or error tests, times too +JTREG_BASIC_OPTIONS += -v:fail,error,time +# Retain all files for failing tests +JTREG_BASIC_OPTIONS += -retain:fail,error +# Ignore tests are not run and completely silent about it +JTREG_IGNORE_OPTION = -ignore:quiet +JTREG_BASIC_OPTIONS += $(JTREG_IGNORE_OPTION) +# Add any extra options +JTREG_BASIC_OPTIONS += $(EXTRA_JTREG_OPTIONS) +# Set other vm and test options +JTREG_TEST_OPTIONS = $(JAVA_ARGS:%=-javaoptions:%) $(JAVA_OPTIONS:%=-vmoption:%) $(JAVA_VM_ARGS:%=-vmoption:%) + # Option to tell jtreg to not run tests marked with "ignore" ifeq ($(PLATFORM), windows) JTREG_KEY_OPTION = -k:!ignore else JTREG_KEY_OPTION = -k:\!ignore endif +JTREG_BASIC_OPTIONS += $(JTREG_KEY_OPTION) -#EXTRA_JTREG_OPTIONS = +# Make sure jtreg exists +$(JTREG): $(JT_HOME) -jtreg_tests: prep $(JT_HOME) $(PRODUCT_HOME) $(JTREG) - $(JTREG) -a -v:fail,error \ - $(JTREG_KEY_OPTION) \ - $(EXTRA_JTREG_OPTIONS) \ - -r:$(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)")/JTreport \ - -w:$(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)")/JTwork \ - -jdk:$(shell $(GETMIXEDPATH) "$(PRODUCT_HOME)") \ - $(JAVA_OPTIONS:%=-vmoption:%) \ - $(JTREG_TESTDIRS) \ - || $(BUNDLE_UP_FAILED) - $(BUNDLE_UP) +jtreg_tests: prep $(PRODUCT_HOME) $(JTREG) + ( \ + ( JT_HOME=$(shell $(GETMIXEDPATH) "$(JT_HOME)"); \ + export JT_HOME; \ + $(shell $(GETMIXEDPATH) "$(JTREG)") \ + $(JTREG_BASIC_OPTIONS) \ + -r:$(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/JTreport") \ + -w:$(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/JTwork") \ + -jdk:$(shell $(GETMIXEDPATH) "$(PRODUCT_HOME)") \ + $(JTREG_EXCLUSIONS) \ + $(JTREG_TEST_OPTIONS) \ + $(TEST_SELECTION) \ + ) ; \ + $(BUNDLE_UP_AND_EXIT) \ + ) 2>&1 | $(TEE) $(ABS_TEST_OUTPUT_DIR)/output.txt ; $(TESTEXIT) PHONY_LIST += jtreg_tests @@ -210,7 +309,7 @@ # clienttest (make sure various basic java client options work) -clienttest: prep $(PRODUCT_HOME) +hotspot_clienttest clienttest: prep $(PRODUCT_HOME) $(PRODUCT_HOME)/bin/java $(JAVA_OPTIONS) -version $(PRODUCT_HOME)/bin/java $(JAVA_OPTIONS) -help $(PRODUCT_HOME)/bin/java $(JAVA_OPTIONS) -X @@ -218,73 +317,27 @@ $(RM) $(PRODUCT_HOME)/jre/bin/client/classes.jsa $(PRODUCT_HOME)/bin/java $(JAVA_OPTIONS) -Xshare:dump -PHONY_LIST += clienttest +PHONY_LIST += hotspot_clienttest clienttest ################################################################ # servertest (make sure various basic java server options work) -servertest: prep $(PRODUCT_HOME) +hotspot_servertest servertest: prep $(PRODUCT_HOME) $(PRODUCT_HOME)/bin/java $(JAVA_OPTIONS) -version $(PRODUCT_HOME)/bin/java $(JAVA_OPTIONS) -help $(PRODUCT_HOME)/bin/java $(JAVA_OPTIONS) -X -PHONY_LIST += servertest +PHONY_LIST += hotspot_servertest servertest ################################################################ # internalvmtests (run internal unit tests inside the VM) -internalvmtests: prep $(PRODUCT_HOME) +hotspot_internalvmtests internalvmtests: prep $(PRODUCT_HOME) $(PRODUCT_HOME)/bin/java $(JAVA_OPTIONS) -XX:+ExecuteInternalVMTests -version -PHONY_LIST += internalvmtests - -################################################################ - -# wbapitest (make sure the whitebox testing api classes work - -wbapitest: prep $(JT_HOME) $(PRODUCT_HOME) $(JTREG) - $(JTREG) -a -v:fail,error \ - $(JTREG_KEY_OPTION) \ - $(EXTRA_JTREG_OPTIONS) \ - -r:$(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)")/JTreport \ - -w:$(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)")/JTwork \ - -jdk:$(shell $(GETMIXEDPATH) "$(PRODUCT_HOME)") \ - $(JAVA_OPTIONS:%=-vmoption:%) \ - $(shell $(GETMIXEDPATH) "$(TEST_ROOT)")/sanity \ - || $(BUNDLE_UP_FAILED) - $(BUNDLE_UP) - -PHONY_LIST += wbapitest - -################################################################ - -# packtest - -# Expect JPRT to set JPRT_PACKTEST_HOME. -PACKTEST_HOME = /net/jprt-web.sfbay.sun.com/jprt/allproducts/packtest -ifdef JPRT_PACKTEST_HOME - PACKTEST_HOME = $(JPRT_PACKTEST_HOME) -endif - -#EXTRA_PACKTEST_OPTIONS = - -packtest: prep $(PACKTEST_HOME)/ptest $(PRODUCT_HOME) - ( $(CD) $(PACKTEST_HOME) && \ - $(PACKTEST_HOME)/ptest \ - -t "$(PRODUCT_HOME)" \ - $(PACKTEST_STRESS_OPTION) \ - $(EXTRA_PACKTEST_OPTIONS) \ - -W $(ABS_TEST_OUTPUT_DIR) \ - $(JAVA_OPTIONS:%=-J %) \ - ) || $(BUNDLE_UP_FAILED) - $(BUNDLE_UP) - -packtest_stress: PACKTEST_STRESS_OPTION=-s -packtest_stress: packtest - -PHONY_LIST += packtest packtest_stress +PHONY_LIST += hotspot_internalvmtests internalvmtests ################################################################ @@ -292,4 +345,3 @@ .PHONY: all clean prep $(PHONY_LIST) ################################################################ - diff -r d553e7400295 -r 6c9ff31edda0 hotspot/test/TEST.groups --- a/hotspot/test/TEST.groups Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/test/TEST.groups Wed Jul 05 19:52:15 2017 +0200 @@ -271,6 +271,7 @@ gc/arguments/TestCMSHeapSizeFlags.java \ gc/arguments/TestMaxNewSize.java \ gc/arguments/TestUseCompressedOopsErgo.java \ + gc/class_unloading/TestCMSClassUnloadingDisabledHWM.java \ gc/concurrentMarkSweep/ \ gc/startup_warnings/TestCMS.java \ gc/startup_warnings/TestCMSIncrementalMode.java \ @@ -325,3 +326,24 @@ -:needs_parallelgc +# When called from top level the test suites use the hotspot_ prefix +hotspot_wbapitest = \ + sanity/ + +hotspot_compiler = \ + sanity/ExecuteInternalVMTests.java + +hotspot_gc = \ + sanity/ExecuteInternalVMTests.java + +hotspot_runtime = \ + sanity/ExecuteInternalVMTests.java + +hotspot_serviceability = \ + sanity/ExecuteInternalVMTests.java + +hotspot_all = \ + :hotspot_compiler \ + :hotspot_gc \ + :hotspot_runtime \ + :hotspot_serviceability diff -r d553e7400295 -r 6c9ff31edda0 hotspot/test/compiler/profiling/TestSpecTrapClassUnloading.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/compiler/profiling/TestSpecTrapClassUnloading.java Wed Jul 05 19:52:15 2017 +0200 @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8031752 + * @summary speculative traps need to be cleaned up at GC + * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-UseOnStackReplacement -XX:-BackgroundCompilation -XX:+UseTypeSpeculation -XX:TypeProfileLevel=222 -XX:CompileCommand=exclude,java.lang.reflect.Method::invoke -XX:CompileCommand=exclude,sun.reflect.DelegatingMethodAccessorImpl::invoke -Xmx512M TestSpecTrapClassUnloading + * + */ + +import java.lang.reflect.Method; + +public class TestSpecTrapClassUnloading { + static class B { + final public boolean m(Object o) { + if (o.getClass() == B.class) { + return true; + } + return false; + } + } + + static class MemoryChunk { + MemoryChunk other; + long[] array; + MemoryChunk(MemoryChunk other) { + this.other = other; + array = new long[1024 * 1024 * 1024]; + } + } + + static void m1(B b, Object o) { + b.m(o); + } + + static void m2(B b, Object o) { + b.m(o); + } + + public static void main(String[] args) throws Exception { + Method m = B.class.getMethod("m", Object.class); + Object o = new Object(); + B b = new B(); + + // add speculative trap in B.m() for m1 + for (int i = 0; i < 20000; i++) { + m1(b, b); + } + m1(b, o); + + // add speculative trap in B.m() for code generated by reflection + for (int i = 0; i < 20000; i++) { + m.invoke(b, b); + } + m.invoke(b, o); + + m = null; + + // add speculative trap in B.m() for m2 + for (int i = 0; i < 20000; i++) { + m2(b, b); + } + m2(b, o); + + // Exhaust memory which causes the code generated by + // reflection to be unloaded but B.m() is not. + MemoryChunk root = null; + try { + while (true) { + root = new MemoryChunk(root); + } + } catch(OutOfMemoryError e) { + root = null; + } + } +} diff -r d553e7400295 -r 6c9ff31edda0 hotspot/test/compiler/profiling/spectrapredefineclass_classloaders/A.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/compiler/profiling/spectrapredefineclass_classloaders/A.java Wed Jul 05 19:52:15 2017 +0200 @@ -0,0 +1,4 @@ +public class A { + void m() { + } +} diff -r d553e7400295 -r 6c9ff31edda0 hotspot/test/compiler/profiling/spectrapredefineclass_classloaders/Agent.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/compiler/profiling/spectrapredefineclass_classloaders/Agent.java Wed Jul 05 19:52:15 2017 +0200 @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.security.*; +import java.lang.instrument.*; +import java.lang.reflect.*; +import java.lang.management.ManagementFactory; +import com.sun.tools.attach.VirtualMachine; +import java.lang.reflect.*; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; +import java.nio.file.Paths; + +public class Agent implements ClassFileTransformer { + public static ClassLoader newClassLoader() { + try { + return new URLClassLoader(new URL[] { + Paths.get(System.getProperty("test.classes",".")).toUri().toURL(), + }, null); + } catch (MalformedURLException e){ + throw new RuntimeException("Unexpected URL conversion failure", e); + } + } + + static public Class Test_class; + + static public void main(String[] args) throws Exception { + + // loader2 must be first on the list so loader 1 must be used first + ClassLoader loader1 = newClassLoader(); + Class dummy = loader1.loadClass("Test"); + + ClassLoader loader2 = newClassLoader(); + + Test_class = loader2.loadClass("Test"); + Method m3 = Test_class.getMethod("m3", ClassLoader.class); + // Add speculative trap in m2() (loaded by loader1) that + // references m4() (loaded by loader2). + m3.invoke(Test_class.newInstance(), loader1); + + String nameOfRunningVM = ManagementFactory.getRuntimeMXBean().getName(); + int p = nameOfRunningVM.indexOf('@'); + String pid = nameOfRunningVM.substring(0, p); + + // Make the nmethod go away + for (int i = 0; i < 10; i++) { + System.gc(); + } + + // Redefine class Test loaded by loader2 + for (int i = 0; i < 2; i++) { + try { + VirtualMachine vm = VirtualMachine.attach(pid); + vm.loadAgent(System.getProperty("test.classes",".") + "/agent.jar", ""); + vm.detach(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + // Will process loader2 first, find m4() is redefined and + // needs to be freed then process loader1, check the + // speculative trap in m2() and try to access m4() which was + // freed already. + for (int i = 0; i < 10; i++) { + System.gc(); + } + } + + public synchronized byte[] transform(final ClassLoader classLoader, + final String className, + Class classBeingRedefined, + ProtectionDomain protectionDomain, + byte[] classfileBuffer) { + System.out.println("Transforming class " + className + " "+ classLoader); + return classfileBuffer; + } + + public static void redefine(String agentArgs, Instrumentation instrumentation, Class to_redefine) { + + try { + instrumentation.retransformClasses(to_redefine); + } catch (Exception e) { + e.printStackTrace(); + } + + } + + public static void agentmain(String agentArgs, Instrumentation instrumentation) throws Exception { + Agent transformer = new Agent(); + instrumentation.addTransformer(transformer, true); + + redefine(agentArgs, instrumentation, Test_class); + } +} diff -r d553e7400295 -r 6c9ff31edda0 hotspot/test/compiler/profiling/spectrapredefineclass_classloaders/B.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/compiler/profiling/spectrapredefineclass_classloaders/B.java Wed Jul 05 19:52:15 2017 +0200 @@ -0,0 +1,5 @@ +public class B extends A { + void m() { + } +} + diff -r d553e7400295 -r 6c9ff31edda0 hotspot/test/compiler/profiling/spectrapredefineclass_classloaders/Launcher.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/compiler/profiling/spectrapredefineclass_classloaders/Launcher.java Wed Jul 05 19:52:15 2017 +0200 @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +import java.io.PrintWriter; +import com.oracle.java.testlibrary.*; + +/* + * @test + * @bug 8040237 + * @library /testlibrary + * @build Agent Test A B + * @run main ClassFileInstaller Agent + * @run main Launcher + * @run main/othervm -XX:-TieredCompilation -XX:-BackgroundCompilation -XX:-UseOnStackReplacement -XX:TypeProfileLevel=222 -XX:ReservedCodeCacheSize=3M Agent + */ +public class Launcher { + public static void main(String[] args) throws Exception { + + PrintWriter pw = new PrintWriter("MANIFEST.MF"); + pw.println("Agent-Class: Agent"); + pw.println("Can-Retransform-Classes: true"); + pw.close(); + + ProcessBuilder pb = new ProcessBuilder(); + pb.command(new String[] { JDKToolFinder.getJDKTool("jar"), "cmf", "MANIFEST.MF", System.getProperty("test.classes",".") + "/agent.jar", "Agent.class"}); + pb.start().waitFor(); + } +} diff -r d553e7400295 -r 6c9ff31edda0 hotspot/test/compiler/profiling/spectrapredefineclass_classloaders/Test.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/compiler/profiling/spectrapredefineclass_classloaders/Test.java Wed Jul 05 19:52:15 2017 +0200 @@ -0,0 +1,50 @@ +import java.lang.reflect.*; + +public class Test { + + public boolean m1(A a, Boolean early_return) { + if (early_return.booleanValue()) return true; + boolean res = m2(a); + return res; + } + + public boolean m2(A a) { + boolean res = false; + if (a.getClass() == B.class) { + a.m(); + } else { + res = true; + } + return res; + } + + public void m3(ClassLoader loader) throws Exception { + Class Test_class = loader.loadClass("Test"); + Object test = Test_class.newInstance(); + Class A_class = loader.loadClass("A"); + Object a = A_class.newInstance(); + Class B_class = loader.loadClass("B"); + Object b = B_class.newInstance(); + Method m1 = Test_class.getMethod("m1", A_class, Boolean.class); + + // So we don't hit uncommon trap in the next loop + for (int i = 0; i < 4000; i++) { + m4(m1, test, a, Boolean.TRUE); + m4(m1, test, b, Boolean.TRUE); + } + for (int i = 0; i < 20000; i++) { + m4(m1, test, a, Boolean.FALSE); + } + for (int i = 0; i < 4; i++) { + m4(m1, test, b, Boolean.FALSE); + } + } + + public Object m4(Method m, Object test, Object a, Object early_return) throws Exception { + return m.invoke(test, a, early_return); + } + + static public A a = new A(); + static public B b = new B(); +} + diff -r d553e7400295 -r 6c9ff31edda0 hotspot/test/compiler/stable/StableConfiguration.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/compiler/stable/StableConfiguration.java Wed Jul 05 19:52:15 2017 +0200 @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package java.lang.invoke; + +import java.lang.reflect.Method; +import java.util.Properties; +import sun.hotspot.WhiteBox; + +public class StableConfiguration { + static final WhiteBox WB = WhiteBox.getWhiteBox(); + static final boolean isStableEnabled; + static final boolean isServerWithStable; + + static { + Boolean value = WB.getBooleanVMFlag("FoldStableValues"); + isStableEnabled = (value == null ? false : value); + isServerWithStable = isStableEnabled && get(); + System.out.println("@Stable: " + (isStableEnabled ? "enabled" : "disabled")); + System.out.println("Server Compiler: " + get()); + } + + // ::get() is among immediately compiled methods. + static boolean get() { + try { + Method m = StableConfiguration.class.getDeclaredMethod("get"); + int level = WB.getMethodCompilationLevel(m); + if (level > 0) { + return (level == 4); + } else { + String javaVM = System.getProperty("java.vm.name", ""); + if (javaVM.contains("Server")) return true; + if (javaVM.contains("Client")) return false; + throw new Error("Unknown VM type: "+javaVM); + } + } catch (NoSuchMethodException e) { + throw new Error(e); + } + } + +} diff -r d553e7400295 -r 6c9ff31edda0 hotspot/test/compiler/stable/TestStableBoolean.java --- a/hotspot/test/compiler/stable/TestStableBoolean.java Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/test/compiler/stable/TestStableBoolean.java Wed Jul 05 19:52:15 2017 +0200 @@ -26,9 +26,11 @@ /* * @test TestStableBoolean * @summary tests on stable fields and arrays - * @library /testlibrary - * @compile -XDignore.symbol.file TestStableBoolean.java + * @library /testlibrary /testlibrary/whitebox + * @build TestStableBoolean StableConfiguration sun.hotspot.WhiteBox + * @run main ClassFileInstaller sun.hotspot.WhiteBox sun.hotspot.WhiteBox$WhiteBoxPermission * @run main ClassFileInstaller + * java/lang/invoke/StableConfiguration * java/lang/invoke/TestStableBoolean * java/lang/invoke/TestStableBoolean$BooleanStable * java/lang/invoke/TestStableBoolean$StaticBooleanStable @@ -48,46 +50,60 @@ * java/lang/invoke/TestStableBoolean$NestedStableField3 * java/lang/invoke/TestStableBoolean$NestedStableField3$A * java/lang/invoke/TestStableBoolean$DefaultValue + * java/lang/invoke/TestStableBoolean$DefaultStaticValue * java/lang/invoke/TestStableBoolean$ObjectArrayLowerDim2 * * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions - * -XX:+UnlockDiagnosticVMOptions -XX:+FoldStableValues -XX:+UseCompressedOop - * -server -XX:-TieredCompilation -Xcomp + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -server -XX:-TieredCompilation + * -XX:+FoldStableValues + * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 + * java.lang.invoke.TestStableBoolean + * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -server -XX:-TieredCompilation + * -XX:-FoldStableValues * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 * java.lang.invoke.TestStableBoolean * * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions - * -XX:+UnlockDiagnosticVMOptions -XX:+FoldStableValues -XX:-UseCompressedOop - * -server -XX:-TieredCompilation -Xcomp + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1 + * -XX:+FoldStableValues + * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 + * java.lang.invoke.TestStableBoolean + * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1 + * -XX:-FoldStableValues * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 * java.lang.invoke.TestStableBoolean * * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions - * -XX:+UnlockDiagnosticVMOptions -XX:-FoldStableValues -XX:+UseCompressedOop - * -server -XX:-TieredCompilation -Xcomp + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -client -XX:-TieredCompilation + * -XX:+FoldStableValues * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 * java.lang.invoke.TestStableBoolean - * * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions - * -XX:+UnlockDiagnosticVMOptions -XX:-FoldStableValues -XX:-UseCompressedOop - * -server -XX:-TieredCompilation -Xcomp + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -client -XX:-TieredCompilation + * -XX:-FoldStableValues * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 * java.lang.invoke.TestStableBoolean */ package java.lang.invoke; -import com.sun.management.HotSpotDiagnosticMXBean; -import com.sun.management.VMOption; -import sun.management.ManagementFactoryHelper; import java.lang.reflect.InvocationTargetException; public class TestStableBoolean { + static final boolean isStableEnabled = StableConfiguration.isStableEnabled; + static final boolean isServerWithStable = StableConfiguration.isServerWithStable; + public static void main(String[] args) throws Exception { - System.out.println("@Stable enabled: "+isStableEnabled); - System.out.println(); - run(DefaultValue.class); run(BooleanStable.class); + run(DefaultStaticValue.class); run(StaticBooleanStable.class); run(VolatileBooleanStable.class); @@ -145,6 +161,21 @@ /* ==================================================== */ + static class DefaultStaticValue { + public static @Stable boolean v; + + public static final DefaultStaticValue c = new DefaultStaticValue(); + public static boolean get() { return c.v; } + public static void test() throws Exception { + boolean val1 = get(); + c.v = true; boolean val2 = get(); + assertEquals(val1, false); + assertEquals(val2, true); + } + } + + /* ==================================================== */ + static class StaticBooleanStable { public static @Stable boolean v; @@ -188,14 +219,14 @@ c.v = new boolean[1]; c.v[0] = true; boolean val1 = get(); c.v[0] = false; boolean val2 = get(); assertEquals(val1, true); - assertEquals(val2, (isStableEnabled ? true : false)); + assertEquals(val2, (isServerWithStable ? true : false)); } { c.v = new boolean[20]; c.v[10] = true; boolean val1 = get1(); c.v[10] = false; boolean val2 = get1(); assertEquals(val1, true); - assertEquals(val2, (isStableEnabled ? true : false)); + assertEquals(val2, (isServerWithStable ? true : false)); } { @@ -220,19 +251,19 @@ c.v = new boolean[1][1]; c.v[0][0] = true; boolean val1 = get(); c.v[0][0] = false; boolean val2 = get(); assertEquals(val1, true); - assertEquals(val2, (isStableEnabled ? true : false)); + assertEquals(val2, (isServerWithStable ? true : false)); c.v = new boolean[1][1]; c.v[0][0] = false; boolean val3 = get(); - assertEquals(val3, (isStableEnabled ? true : false)); + assertEquals(val3, (isServerWithStable ? true : false)); c.v[0] = new boolean[1]; c.v[0][0] = false; boolean val4 = get(); - assertEquals(val4, (isStableEnabled ? true : false)); + assertEquals(val4, (isServerWithStable ? true : false)); } { c.v = new boolean[1][1]; boolean[] val1 = get1(); c.v[0] = new boolean[1]; boolean[] val2 = get1(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { @@ -258,28 +289,28 @@ c.v = new boolean[1][1][1]; c.v[0][0][0] = true; boolean val1 = get(); c.v[0][0][0] = false; boolean val2 = get(); assertEquals(val1, true); - assertEquals(val2, (isStableEnabled ? true : false)); + assertEquals(val2, (isServerWithStable ? true : false)); c.v = new boolean[1][1][1]; c.v[0][0][0] = false; boolean val3 = get(); - assertEquals(val3, (isStableEnabled ? true : false)); + assertEquals(val3, (isServerWithStable ? true : false)); c.v[0] = new boolean[1][1]; c.v[0][0][0] = false; boolean val4 = get(); - assertEquals(val4, (isStableEnabled ? true : false)); + assertEquals(val4, (isServerWithStable ? true : false)); c.v[0][0] = new boolean[1]; c.v[0][0][0] = false; boolean val5 = get(); - assertEquals(val5, (isStableEnabled ? true : false)); + assertEquals(val5, (isServerWithStable ? true : false)); } { c.v = new boolean[1][1][1]; boolean[] val1 = get1(); c.v[0][0] = new boolean[1]; boolean[] val2 = get1(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { c.v = new boolean[1][1][1]; boolean[][] val1 = get2(); c.v[0] = new boolean[1][1]; boolean[][] val2 = get2(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { @@ -306,37 +337,37 @@ c.v = new boolean[1][1][1][1]; c.v[0][0][0][0] = true; boolean val1 = get(); c.v[0][0][0][0] = false; boolean val2 = get(); assertEquals(val1, true); - assertEquals(val2, (isStableEnabled ? true : false)); + assertEquals(val2, (isServerWithStable ? true : false)); c.v = new boolean[1][1][1][1]; c.v[0][0][0][0] = false; boolean val3 = get(); - assertEquals(val3, (isStableEnabled ? true : false)); + assertEquals(val3, (isServerWithStable ? true : false)); c.v[0] = new boolean[1][1][1]; c.v[0][0][0][0] = false; boolean val4 = get(); - assertEquals(val4, (isStableEnabled ? true : false)); + assertEquals(val4, (isServerWithStable ? true : false)); c.v[0][0] = new boolean[1][1]; c.v[0][0][0][0] = false; boolean val5 = get(); - assertEquals(val5, (isStableEnabled ? true : false)); + assertEquals(val5, (isServerWithStable ? true : false)); c.v[0][0][0] = new boolean[1]; c.v[0][0][0][0] = false; boolean val6 = get(); - assertEquals(val6, (isStableEnabled ? true : false)); + assertEquals(val6, (isServerWithStable ? true : false)); } { c.v = new boolean[1][1][1][1]; boolean[] val1 = get1(); c.v[0][0][0] = new boolean[1]; boolean[] val2 = get1(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { c.v = new boolean[1][1][1][1]; boolean[][] val1 = get2(); c.v[0][0] = new boolean[1][1]; boolean[][] val2 = get2(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { c.v = new boolean[1][1][1][1]; boolean[][][] val1 = get3(); c.v[0] = new boolean[1][1][1]; boolean[][][] val2 = get3(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { @@ -399,7 +430,7 @@ c.v = new boolean[1][1]; c.v[0] = new boolean[0]; boolean[] val1 = get1(); c.v[0] = new boolean[0]; boolean[] val2 = get1(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { @@ -435,14 +466,14 @@ c.v = new boolean[1][1][1]; c.v[0][0] = new boolean[0]; boolean[] val1 = get1(); c.v[0][0] = new boolean[0]; boolean[] val2 = get1(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { c.v = new boolean[1][1][1]; c.v[0] = new boolean[0][0]; boolean[][] val1 = get2(); c.v[0] = new boolean[0][0]; boolean[][] val2 = get2(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { @@ -577,7 +608,7 @@ elem.a = false; boolean val3 = get(); boolean val4 = get1(); assertEquals(val1, true); - assertEquals(val3, (isStableEnabled ? true : false)); + assertEquals(val3, (isServerWithStable ? true : false)); assertEquals(val2, true); assertEquals(val4, false); @@ -611,17 +642,4 @@ } } } - - static final boolean isStableEnabled; - static { - HotSpotDiagnosticMXBean diagnostic - = ManagementFactoryHelper.getDiagnosticMXBean(); - VMOption tmp; - try { - tmp = diagnostic.getVMOption("FoldStableValues"); - } catch (IllegalArgumentException e) { - tmp = null; - } - isStableEnabled = (tmp == null ? false : Boolean.parseBoolean(tmp.getValue())); - } } diff -r d553e7400295 -r 6c9ff31edda0 hotspot/test/compiler/stable/TestStableByte.java --- a/hotspot/test/compiler/stable/TestStableByte.java Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/test/compiler/stable/TestStableByte.java Wed Jul 05 19:52:15 2017 +0200 @@ -26,9 +26,11 @@ /* * @test TestStableByte * @summary tests on stable fields and arrays - * @library /testlibrary - * @compile -XDignore.symbol.file TestStableByte.java + * @library /testlibrary /testlibrary/whitebox + * @build TestStableByte StableConfiguration sun.hotspot.WhiteBox + * @run main ClassFileInstaller sun.hotspot.WhiteBox sun.hotspot.WhiteBox$WhiteBoxPermission * @run main ClassFileInstaller + * java/lang/invoke/StableConfiguration * java/lang/invoke/TestStableByte * java/lang/invoke/TestStableByte$ByteStable * java/lang/invoke/TestStableByte$StaticByteStable @@ -48,46 +50,60 @@ * java/lang/invoke/TestStableByte$NestedStableField3 * java/lang/invoke/TestStableByte$NestedStableField3$A * java/lang/invoke/TestStableByte$DefaultValue + * java/lang/invoke/TestStableByte$DefaultStaticValue * java/lang/invoke/TestStableByte$ObjectArrayLowerDim2 * * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions - * -XX:+UnlockDiagnosticVMOptions -XX:+FoldStableValues -XX:+UseCompressedOop - * -server -XX:-TieredCompilation -Xcomp + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -server -XX:-TieredCompilation + * -XX:+FoldStableValues + * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 + * java.lang.invoke.TestStableByte + * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -server -XX:-TieredCompilation + * -XX:-FoldStableValues * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 * java.lang.invoke.TestStableByte * * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions - * -XX:+UnlockDiagnosticVMOptions -XX:+FoldStableValues -XX:-UseCompressedOop - * -server -XX:-TieredCompilation -Xcomp + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1 + * -XX:+FoldStableValues + * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 + * java.lang.invoke.TestStableByte + * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1 + * -XX:-FoldStableValues * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 * java.lang.invoke.TestStableByte * * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions - * -XX:+UnlockDiagnosticVMOptions -XX:-FoldStableValues -XX:+UseCompressedOop - * -server -XX:-TieredCompilation -Xcomp + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -client -XX:-TieredCompilation + * -XX:+FoldStableValues * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 * java.lang.invoke.TestStableByte - * * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions - * -XX:+UnlockDiagnosticVMOptions -XX:-FoldStableValues -XX:-UseCompressedOop - * -server -XX:-TieredCompilation -Xcomp + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -client -XX:-TieredCompilation + * -XX:-FoldStableValues * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 * java.lang.invoke.TestStableByte */ package java.lang.invoke; -import com.sun.management.HotSpotDiagnosticMXBean; -import com.sun.management.VMOption; -import sun.management.ManagementFactoryHelper; import java.lang.reflect.InvocationTargetException; public class TestStableByte { + static final boolean isStableEnabled = StableConfiguration.isStableEnabled; + static final boolean isServerWithStable = StableConfiguration.isServerWithStable; + public static void main(String[] args) throws Exception { - System.out.println("@Stable enabled: "+isStableEnabled); - System.out.println(); - run(DefaultValue.class); run(ByteStable.class); + run(DefaultStaticValue.class); run(StaticByteStable.class); run(VolatileByteStable.class); @@ -145,6 +161,21 @@ /* ==================================================== */ + static class DefaultStaticValue { + public static @Stable byte v; + + public static final DefaultStaticValue c = new DefaultStaticValue(); + public static byte get() { return c.v; } + public static void test() throws Exception { + byte val1 = get(); + c.v = 1; byte val2 = get(); + assertEquals(val1, 0); + assertEquals(val2, 1); + } + } + + /* ==================================================== */ + static class StaticByteStable { public static @Stable byte v; @@ -188,20 +219,22 @@ c.v = new byte[1]; c.v[0] = 1; byte val1 = get(); c.v[0] = 2; byte val2 = get(); assertEquals(val1, 1); - assertEquals(val2, (isStableEnabled ? 1 : 2)); + assertEquals(val2, (isServerWithStable ? 1 : 2)); c.v = new byte[1]; c.v[0] = 3; byte val3 = get(); - assertEquals(val3, (isStableEnabled ? 1 : 3)); + assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1 : 2) + : 3)); } { c.v = new byte[20]; c.v[10] = 1; byte val1 = get1(); c.v[10] = 2; byte val2 = get1(); assertEquals(val1, 1); - assertEquals(val2, (isStableEnabled ? 1 : 2)); + assertEquals(val2, (isServerWithStable ? 1 : 2)); c.v = new byte[20]; c.v[10] = 3; byte val3 = get1(); - assertEquals(val3, (isStableEnabled ? 1 : 3)); + assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1 : 2) + : 3)); } { @@ -226,19 +259,21 @@ c.v = new byte[1][1]; c.v[0][0] = 1; byte val1 = get(); c.v[0][0] = 2; byte val2 = get(); assertEquals(val1, 1); - assertEquals(val2, (isStableEnabled ? 1 : 2)); + assertEquals(val2, (isServerWithStable ? 1 : 2)); c.v = new byte[1][1]; c.v[0][0] = 3; byte val3 = get(); - assertEquals(val3, (isStableEnabled ? 1 : 3)); + assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1 : 2) + : 3)); c.v[0] = new byte[1]; c.v[0][0] = 4; byte val4 = get(); - assertEquals(val4, (isStableEnabled ? 1 : 4)); + assertEquals(val4, (isStableEnabled ? (isServerWithStable ? 1 : 2) + : 4)); } { c.v = new byte[1][1]; byte[] val1 = get1(); c.v[0] = new byte[1]; byte[] val2 = get1(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { @@ -264,28 +299,31 @@ c.v = new byte[1][1][1]; c.v[0][0][0] = 1; byte val1 = get(); c.v[0][0][0] = 2; byte val2 = get(); assertEquals(val1, 1); - assertEquals(val2, (isStableEnabled ? 1 : 2)); + assertEquals(val2, (isServerWithStable ? 1 : 2)); c.v = new byte[1][1][1]; c.v[0][0][0] = 3; byte val3 = get(); - assertEquals(val3, (isStableEnabled ? 1 : 3)); + assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1 : 2) + : 3)); c.v[0] = new byte[1][1]; c.v[0][0][0] = 4; byte val4 = get(); - assertEquals(val4, (isStableEnabled ? 1 : 4)); + assertEquals(val4, (isStableEnabled ? (isServerWithStable ? 1 : 2) + : 4)); c.v[0][0] = new byte[1]; c.v[0][0][0] = 5; byte val5 = get(); - assertEquals(val5, (isStableEnabled ? 1 : 5)); + assertEquals(val5, (isStableEnabled ? (isServerWithStable ? 1 : 2) + : 5)); } { c.v = new byte[1][1][1]; byte[] val1 = get1(); c.v[0][0] = new byte[1]; byte[] val2 = get1(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { c.v = new byte[1][1][1]; byte[][] val1 = get2(); c.v[0] = new byte[1][1]; byte[][] val2 = get2(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { @@ -312,37 +350,41 @@ c.v = new byte[1][1][1][1]; c.v[0][0][0][0] = 1; byte val1 = get(); c.v[0][0][0][0] = 2; byte val2 = get(); assertEquals(val1, 1); - assertEquals(val2, (isStableEnabled ? 1 : 2)); + assertEquals(val2, (isServerWithStable ? 1 : 2)); c.v = new byte[1][1][1][1]; c.v[0][0][0][0] = 3; byte val3 = get(); - assertEquals(val3, (isStableEnabled ? 1 : 3)); + assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1 : 2) + : 3)); c.v[0] = new byte[1][1][1]; c.v[0][0][0][0] = 4; byte val4 = get(); - assertEquals(val4, (isStableEnabled ? 1 : 4)); + assertEquals(val4, (isStableEnabled ? (isServerWithStable ? 1 : 2) + : 4)); c.v[0][0] = new byte[1][1]; c.v[0][0][0][0] = 5; byte val5 = get(); - assertEquals(val5, (isStableEnabled ? 1 : 5)); + assertEquals(val5, (isStableEnabled ? (isServerWithStable ? 1 : 2) + : 5)); c.v[0][0][0] = new byte[1]; c.v[0][0][0][0] = 6; byte val6 = get(); - assertEquals(val6, (isStableEnabled ? 1 : 6)); + assertEquals(val6, (isStableEnabled ? (isServerWithStable ? 1 : 2) + : 6)); } { c.v = new byte[1][1][1][1]; byte[] val1 = get1(); c.v[0][0][0] = new byte[1]; byte[] val2 = get1(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { c.v = new byte[1][1][1][1]; byte[][] val1 = get2(); c.v[0][0] = new byte[1][1]; byte[][] val2 = get2(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { c.v = new byte[1][1][1][1]; byte[][][] val1 = get3(); c.v[0] = new byte[1][1][1]; byte[][][] val2 = get3(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { @@ -404,7 +446,7 @@ c.v = new byte[1][1]; c.v[0] = new byte[0]; byte[] val1 = get1(); c.v[0] = new byte[0]; byte[] val2 = get1(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { @@ -440,14 +482,14 @@ c.v = new byte[1][1][1]; c.v[0][0] = new byte[0]; byte[] val1 = get1(); c.v[0][0] = new byte[0]; byte[] val2 = get1(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { c.v = new byte[1][1][1]; c.v[0] = new byte[0][0]; byte[][] val1 = get2(); c.v[0] = new byte[0][0]; byte[][] val2 = get2(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { @@ -582,7 +624,7 @@ elem.a = 2; byte val3 = get(); byte val4 = get1(); assertEquals(val1, 1); - assertEquals(val3, (isStableEnabled ? 1 : 2)); + assertEquals(val3, (isServerWithStable ? 1 : 2)); assertEquals(val2, 1); assertEquals(val4, 2); @@ -616,17 +658,4 @@ } } } - - static final boolean isStableEnabled; - static { - HotSpotDiagnosticMXBean diagnostic - = ManagementFactoryHelper.getDiagnosticMXBean(); - VMOption tmp; - try { - tmp = diagnostic.getVMOption("FoldStableValues"); - } catch (IllegalArgumentException e) { - tmp = null; - } - isStableEnabled = (tmp == null ? false : Boolean.parseBoolean(tmp.getValue())); - } } diff -r d553e7400295 -r 6c9ff31edda0 hotspot/test/compiler/stable/TestStableChar.java --- a/hotspot/test/compiler/stable/TestStableChar.java Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/test/compiler/stable/TestStableChar.java Wed Jul 05 19:52:15 2017 +0200 @@ -26,9 +26,11 @@ /* * @test TestStableChar * @summary tests on stable fields and arrays - * @library /testlibrary - * @compile -XDignore.symbol.file TestStableChar.java + * @library /testlibrary /testlibrary/whitebox + * @build TestStableChar StableConfiguration sun.hotspot.WhiteBox + * @run main ClassFileInstaller sun.hotspot.WhiteBox sun.hotspot.WhiteBox$WhiteBoxPermission * @run main ClassFileInstaller + * java/lang/invoke/StableConfiguration * java/lang/invoke/TestStableChar * java/lang/invoke/TestStableChar$CharStable * java/lang/invoke/TestStableChar$StaticCharStable @@ -48,46 +50,60 @@ * java/lang/invoke/TestStableChar$NestedStableField3 * java/lang/invoke/TestStableChar$NestedStableField3$A * java/lang/invoke/TestStableChar$DefaultValue + * java/lang/invoke/TestStableChar$DefaultStaticValue * java/lang/invoke/TestStableChar$ObjectArrayLowerDim2 * * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions - * -XX:+UnlockDiagnosticVMOptions -XX:+FoldStableValues -XX:-UseCompressedOop - * -server -XX:-TieredCompilation -Xcomp + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -server -XX:-TieredCompilation + * -XX:+FoldStableValues + * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 + * java.lang.invoke.TestStableChar + * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -server -XX:-TieredCompilation + * -XX:-FoldStableValues * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 * java.lang.invoke.TestStableChar * * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions - * -XX:+UnlockDiagnosticVMOptions -XX:+FoldStableValues -XX:+UseCompressedOop - * -server -XX:-TieredCompilation -Xcomp + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1 + * -XX:+FoldStableValues + * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 + * java.lang.invoke.TestStableChar + * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1 + * -XX:-FoldStableValues * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 * java.lang.invoke.TestStableChar * * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions - * -XX:+UnlockDiagnosticVMOptions -XX:-FoldStableValues -XX:+UseCompressedOop - * -server -XX:-TieredCompilation -Xcomp + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -client -XX:-TieredCompilation + * -XX:+FoldStableValues * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 * java.lang.invoke.TestStableChar - * * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions - * -XX:+UnlockDiagnosticVMOptions -XX:-FoldStableValues -XX:-UseCompressedOop - * -server -XX:-TieredCompilation -Xcomp + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -client -XX:-TieredCompilation + * -XX:-FoldStableValues * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 * java.lang.invoke.TestStableChar */ package java.lang.invoke; -import com.sun.management.HotSpotDiagnosticMXBean; -import com.sun.management.VMOption; -import sun.management.ManagementFactoryHelper; import java.lang.reflect.InvocationTargetException; public class TestStableChar { + static final boolean isStableEnabled = StableConfiguration.isStableEnabled; + static final boolean isServerWithStable = StableConfiguration.isServerWithStable; + public static void main(String[] args) throws Exception { - System.out.println("@Stable enabled: "+isStableEnabled); - System.out.println(); - run(DefaultValue.class); run(CharStable.class); + run(DefaultStaticValue.class); run(StaticCharStable.class); run(VolatileCharStable.class); @@ -145,6 +161,21 @@ /* ==================================================== */ + static class DefaultStaticValue { + public static @Stable char v; + + public static final DefaultStaticValue c = new DefaultStaticValue(); + public static char get() { return c.v; } + public static void test() throws Exception { + char val1 = get(); + c.v = 'a'; char val2 = get(); + assertEquals(val1, 0); + assertEquals(val2, 'a'); + } + } + + /* ==================================================== */ + static class StaticCharStable { public @Stable char v; @@ -188,20 +219,22 @@ c.v = new char[1]; c.v[0] = 'a'; char val1 = get(); c.v[0] = 'b'; char val2 = get(); assertEquals(val1, 'a'); - assertEquals(val2, (isStableEnabled ? 'a' : 'b')); + assertEquals(val2, (isServerWithStable ? 'a' : 'b')); c.v = new char[1]; c.v[0] = 'c'; char val3 = get(); - assertEquals(val3, (isStableEnabled ? 'a' : 'c')); + assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 'a' : 'b') + : 'c')); } { c.v = new char[20]; c.v[10] = 'a'; char val1 = get1(); c.v[10] = 'b'; char val2 = get1(); assertEquals(val1, 'a'); - assertEquals(val2, (isStableEnabled ? 'a' : 'b')); + assertEquals(val2, (isServerWithStable ? 'a' : 'b')); c.v = new char[20]; c.v[10] = 'c'; char val3 = get1(); - assertEquals(val3, (isStableEnabled ? 'a' : 'c')); + assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 'a' : 'b') + : 'c')); } { @@ -226,19 +259,21 @@ c.v = new char[1][1]; c.v[0][0] = 'a'; char val1 = get(); c.v[0][0] = 'b'; char val2 = get(); assertEquals(val1, 'a'); - assertEquals(val2, (isStableEnabled ? 'a' : 'b')); + assertEquals(val2, (isServerWithStable ? 'a' : 'b')); c.v = new char[1][1]; c.v[0][0] = 'c'; char val3 = get(); - assertEquals(val3, (isStableEnabled ? 'a' : 'c')); + assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 'a' : 'b') + : 'c')); c.v[0] = new char[1]; c.v[0][0] = 'd'; char val4 = get(); - assertEquals(val4, (isStableEnabled ? 'a' : 'd')); + assertEquals(val4, (isStableEnabled ? (isServerWithStable ? 'a' : 'b') + : 'd')); } { c.v = new char[1][1]; char[] val1 = get1(); c.v[0] = new char[1]; char[] val2 = get1(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { @@ -264,28 +299,31 @@ c.v = new char[1][1][1]; c.v[0][0][0] = 'a'; char val1 = get(); c.v[0][0][0] = 'b'; char val2 = get(); assertEquals(val1, 'a'); - assertEquals(val2, (isStableEnabled ? 'a' : 'b')); + assertEquals(val2, (isServerWithStable ? 'a' : 'b')); c.v = new char[1][1][1]; c.v[0][0][0] = 'c'; char val3 = get(); - assertEquals(val3, (isStableEnabled ? 'a' : 'c')); + assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 'a' : 'b') + : 'c')); c.v[0] = new char[1][1]; c.v[0][0][0] = 'd'; char val4 = get(); - assertEquals(val4, (isStableEnabled ? 'a' : 'd')); + assertEquals(val4, (isStableEnabled ? (isServerWithStable ? 'a' : 'b') + : 'd')); c.v[0][0] = new char[1]; c.v[0][0][0] = 'e'; char val5 = get(); - assertEquals(val5, (isStableEnabled ? 'a' : 'e')); + assertEquals(val5, (isStableEnabled ? (isServerWithStable ? 'a' : 'b') + : 'e')); } { c.v = new char[1][1][1]; char[] val1 = get1(); c.v[0][0] = new char[1]; char[] val2 = get1(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { c.v = new char[1][1][1]; char[][] val1 = get2(); c.v[0] = new char[1][1]; char[][] val2 = get2(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { @@ -312,37 +350,41 @@ c.v = new char[1][1][1][1]; c.v[0][0][0][0] = 'a'; char val1 = get(); c.v[0][0][0][0] = 'b'; char val2 = get(); assertEquals(val1, 'a'); - assertEquals(val2, (isStableEnabled ? 'a' : 'b')); + assertEquals(val2, (isServerWithStable ? 'a' : 'b')); c.v = new char[1][1][1][1]; c.v[0][0][0][0] = 'c'; char val3 = get(); - assertEquals(val3, (isStableEnabled ? 'a' : 'c')); + assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 'a' : 'b') + : 'c')); c.v[0] = new char[1][1][1]; c.v[0][0][0][0] = 'd'; char val4 = get(); - assertEquals(val4, (isStableEnabled ? 'a' : 'd')); + assertEquals(val4, (isStableEnabled ? (isServerWithStable ? 'a' : 'b') + : 'd')); c.v[0][0] = new char[1][1]; c.v[0][0][0][0] = 'e'; char val5 = get(); - assertEquals(val5, (isStableEnabled ? 'a' : 'e')); + assertEquals(val5, (isStableEnabled ? (isServerWithStable ? 'a' : 'b') + : 'e')); c.v[0][0][0] = new char[1]; c.v[0][0][0][0] = 'f'; char val6 = get(); - assertEquals(val6, (isStableEnabled ? 'a' : 'f')); + assertEquals(val6, (isStableEnabled ? (isServerWithStable ? 'a' : 'b') + : 'f')); } { c.v = new char[1][1][1][1]; char[] val1 = get1(); c.v[0][0][0] = new char[1]; char[] val2 = get1(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { c.v = new char[1][1][1][1]; char[][] val1 = get2(); c.v[0][0] = new char[1][1]; char[][] val2 = get2(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { c.v = new char[1][1][1][1]; char[][][] val1 = get3(); c.v[0] = new char[1][1][1]; char[][][] val2 = get3(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { @@ -350,7 +392,6 @@ c.v = new char[1][1][1][1]; char[][][][] val2 = get4(); assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); } - } } @@ -403,7 +444,7 @@ c.v = new char[1][1]; c.v[0] = new char[0]; char[] val1 = get1(); c.v[0] = new char[0]; char[] val2 = get1(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { @@ -439,14 +480,14 @@ c.v = new char[1][1][1]; c.v[0][0] = new char[0]; char[] val1 = get1(); c.v[0][0] = new char[0]; char[] val2 = get1(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { c.v = new char[1][1][1]; c.v[0] = new char[0][0]; char[][] val1 = get2(); c.v[0] = new char[0][0]; char[][] val2 = get2(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { @@ -581,7 +622,7 @@ elem.a = 'b'; char val3 = get(); char val4 = get1(); assertEquals(val1, 'a'); - assertEquals(val3, (isStableEnabled ? 'a' : 'b')); + assertEquals(val3, (isServerWithStable ? 'a' : 'b')); assertEquals(val2, 'a'); assertEquals(val4, 'b'); @@ -615,17 +656,4 @@ } } } - - static final boolean isStableEnabled; - static { - HotSpotDiagnosticMXBean diagnostic - = ManagementFactoryHelper.getDiagnosticMXBean(); - VMOption tmp; - try { - tmp = diagnostic.getVMOption("FoldStableValues"); - } catch (IllegalArgumentException e) { - tmp = null; - } - isStableEnabled = (tmp == null ? false : Boolean.parseBoolean(tmp.getValue())); - } } diff -r d553e7400295 -r 6c9ff31edda0 hotspot/test/compiler/stable/TestStableDouble.java --- a/hotspot/test/compiler/stable/TestStableDouble.java Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/test/compiler/stable/TestStableDouble.java Wed Jul 05 19:52:15 2017 +0200 @@ -26,9 +26,11 @@ /* * @test TestStableDouble * @summary tests on stable fields and arrays - * @library /testlibrary - * @compile -XDignore.symbol.file TestStableDouble.java + * @library /testlibrary /testlibrary/whitebox + * @build TestStableDouble StableConfiguration sun.hotspot.WhiteBox + * @run main ClassFileInstaller sun.hotspot.WhiteBox sun.hotspot.WhiteBox$WhiteBoxPermission * @run main ClassFileInstaller + * java/lang/invoke/StableConfiguration * java/lang/invoke/TestStableDouble * java/lang/invoke/TestStableDouble$DoubleStable * java/lang/invoke/TestStableDouble$StaticDoubleStable @@ -48,46 +50,60 @@ * java/lang/invoke/TestStableDouble$NestedStableField3 * java/lang/invoke/TestStableDouble$NestedStableField3$A * java/lang/invoke/TestStableDouble$DefaultValue + * java/lang/invoke/TestStableDouble$DefaultStaticValue * java/lang/invoke/TestStableDouble$ObjectArrayLowerDim2 * * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions - * -XX:+UnlockDiagnosticVMOptions -XX:+FoldStableValues -XX:+UseCompressedOop - * -server -XX:-TieredCompilation -Xcomp + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -server -XX:-TieredCompilation + * -XX:+FoldStableValues + * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 + * java.lang.invoke.TestStableDouble + * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -server -XX:-TieredCompilation + * -XX:-FoldStableValues * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 * java.lang.invoke.TestStableDouble * * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions - * -XX:+UnlockDiagnosticVMOptions -XX:+FoldStableValues -XX:-UseCompressedOop - * -server -XX:-TieredCompilation -Xcomp + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1 + * -XX:+FoldStableValues + * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 + * java.lang.invoke.TestStableDouble + * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1 + * -XX:-FoldStableValues * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 * java.lang.invoke.TestStableDouble * * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions - * -XX:+UnlockDiagnosticVMOptions -XX:-FoldStableValues -XX:+UseCompressedOop - * -server -XX:-TieredCompilation -Xcomp + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -client -XX:-TieredCompilation + * -XX:+FoldStableValues * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 * java.lang.invoke.TestStableDouble - * * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions - * -XX:+UnlockDiagnosticVMOptions -XX:-FoldStableValues -XX:-UseCompressedOop - * -server -XX:-TieredCompilation -Xcomp + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -client -XX:-TieredCompilation + * -XX:-FoldStableValues * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 * java.lang.invoke.TestStableDouble */ package java.lang.invoke; -import com.sun.management.HotSpotDiagnosticMXBean; -import com.sun.management.VMOption; -import sun.management.ManagementFactoryHelper; import java.lang.reflect.InvocationTargetException; public class TestStableDouble { + static final boolean isStableEnabled = StableConfiguration.isStableEnabled; + static final boolean isServerWithStable = StableConfiguration.isServerWithStable; + public static void main(String[] args) throws Exception { - System.out.println("@Stable enabled: "+isStableEnabled); - System.out.println(); - run(DefaultValue.class); run(DoubleStable.class); + run(DefaultStaticValue.class); run(StaticDoubleStable.class); run(VolatileDoubleStable.class); @@ -145,6 +161,21 @@ /* ==================================================== */ + static class DefaultStaticValue { + public static @Stable double v; + + public static final DefaultStaticValue c = new DefaultStaticValue(); + public static double get() { return c.v; } + public static void test() throws Exception { + double val1 = get(); + c.v = 1.0; double val2 = get(); + assertEquals(val1, 0); + assertEquals(val2, 1.0); + } + } + + /* ==================================================== */ + static class StaticDoubleStable { public static @Stable double v; @@ -188,20 +219,22 @@ c.v = new double[1]; c.v[0] = 1.0; double val1 = get(); c.v[0] = 2.0; double val2 = get(); assertEquals(val1, 1.0); - assertEquals(val2, (isStableEnabled ? 1.0 : 2.0)); + assertEquals(val2, (isServerWithStable ? 1.0 : 2.0)); c.v = new double[1]; c.v[0] = 3.0; double val3 = get(); - assertEquals(val3, (isStableEnabled ? 1.0 : 3.0)); + assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1.0 : 2.0) + : 3.0)); } { c.v = new double[20]; c.v[10] = 1.0; double val1 = get1(); c.v[10] = 2.0; double val2 = get1(); assertEquals(val1, 1.0); - assertEquals(val2, (isStableEnabled ? 1.0 : 2.0)); + assertEquals(val2, (isServerWithStable ? 1.0 : 2.0)); c.v = new double[20]; c.v[10] = 3.0; double val3 = get1(); - assertEquals(val3, (isStableEnabled ? 1.0 : 3.0)); + assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1.0 : 2.0) + : 3.0)); } { @@ -226,19 +259,21 @@ c.v = new double[1][1]; c.v[0][0] = 1.0; double val1 = get(); c.v[0][0] = 2.0; double val2 = get(); assertEquals(val1, 1.0); - assertEquals(val2, (isStableEnabled ? 1.0 : 2.0)); + assertEquals(val2, (isServerWithStable ? 1.0 : 2.0)); c.v = new double[1][1]; c.v[0][0] = 3.0; double val3 = get(); - assertEquals(val3, (isStableEnabled ? 1.0 : 3.0)); + assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1.0 : 2.0) + : 3.0)); c.v[0] = new double[1]; c.v[0][0] = 4.0; double val4 = get(); - assertEquals(val4, (isStableEnabled ? 1.0 : 4.0)); + assertEquals(val4, (isStableEnabled ? (isServerWithStable ? 1.0 : 2.0) + : 4.0)); } { c.v = new double[1][1]; double[] val1 = get1(); c.v[0] = new double[1]; double[] val2 = get1(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { @@ -264,28 +299,31 @@ c.v = new double[1][1][1]; c.v[0][0][0] = 1.0; double val1 = get(); c.v[0][0][0] = 2.0; double val2 = get(); assertEquals(val1, 1.0); - assertEquals(val2, (isStableEnabled ? 1.0 : 2.0)); + assertEquals(val2, (isServerWithStable ? 1.0 : 2.0)); c.v = new double[1][1][1]; c.v[0][0][0] = 3.0; double val3 = get(); - assertEquals(val3, (isStableEnabled ? 1.0 : 3.0)); + assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1.0 : 2.0) + : 3.0)); c.v[0] = new double[1][1]; c.v[0][0][0] = 4.0; double val4 = get(); - assertEquals(val4, (isStableEnabled ? 1.0 : 4.0)); + assertEquals(val4, (isStableEnabled ? (isServerWithStable ? 1.0 : 2.0) + : 4.0)); c.v[0][0] = new double[1]; c.v[0][0][0] = 5.0; double val5 = get(); - assertEquals(val5, (isStableEnabled ? 1.0 : 5.0)); + assertEquals(val5, (isStableEnabled ? (isServerWithStable ? 1.0 : 2.0) + : 5.0)); } { c.v = new double[1][1][1]; double[] val1 = get1(); c.v[0][0] = new double[1]; double[] val2 = get1(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { c.v = new double[1][1][1]; double[][] val1 = get2(); c.v[0] = new double[1][1]; double[][] val2 = get2(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { @@ -312,37 +350,41 @@ c.v = new double[1][1][1][1]; c.v[0][0][0][0] = 1.0; double val1 = get(); c.v[0][0][0][0] = 2.0; double val2 = get(); assertEquals(val1, 1.0); - assertEquals(val2, (isStableEnabled ? 1.0 : 2.0)); + assertEquals(val2, (isServerWithStable ? 1.0 : 2.0)); c.v = new double[1][1][1][1]; c.v[0][0][0][0] = 3.0; double val3 = get(); - assertEquals(val3, (isStableEnabled ? 1.0 : 3.0)); + assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1.0 : 2.0) + : 3.0)); c.v[0] = new double[1][1][1]; c.v[0][0][0][0] = 4.0; double val4 = get(); - assertEquals(val4, (isStableEnabled ? 1.0 : 4.0)); + assertEquals(val4, (isStableEnabled ? (isServerWithStable ? 1.0 : 2.0) + : 4.0)); c.v[0][0] = new double[1][1]; c.v[0][0][0][0] = 5.0; double val5 = get(); - assertEquals(val5, (isStableEnabled ? 1.0 : 5.0)); + assertEquals(val5, (isStableEnabled ? (isServerWithStable ? 1.0 : 2.0) + : 5.0)); c.v[0][0][0] = new double[1]; c.v[0][0][0][0] = 6.0; double val6 = get(); - assertEquals(val6, (isStableEnabled ? 1.0 : 6.0)); + assertEquals(val6, (isStableEnabled ? (isServerWithStable ? 1.0 : 2.0) + : 6.0)); } { c.v = new double[1][1][1][1]; double[] val1 = get1(); c.v[0][0][0] = new double[1]; double[] val2 = get1(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { c.v = new double[1][1][1][1]; double[][] val1 = get2(); c.v[0][0] = new double[1][1]; double[][] val2 = get2(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { c.v = new double[1][1][1][1]; double[][][] val1 = get3(); c.v[0] = new double[1][1][1]; double[][][] val2 = get3(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { @@ -350,13 +392,11 @@ c.v = new double[1][1][1][1]; double[][][][] val2 = get4(); assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); } - } } /* ==================================================== */ // Dynamic Dim is higher than static - static class ObjectArrayLowerDim0 { public @Stable Object v; @@ -404,7 +444,7 @@ c.v = new double[1][1]; c.v[0] = new double[0]; double[] val1 = get1(); c.v[0] = new double[0]; double[] val2 = get1(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { @@ -440,14 +480,14 @@ c.v = new double[1][1][1]; c.v[0][0] = new double[0]; double[] val1 = get1(); c.v[0][0] = new double[0]; double[] val2 = get1(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { c.v = new double[1][1][1]; c.v[0] = new double[0][0]; double[][] val1 = get2(); c.v[0] = new double[0][0]; double[][] val2 = get2(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { @@ -582,7 +622,7 @@ elem.a = 2.0; double val3 = get(); double val4 = get1(); assertEquals(val1, 1.0); - assertEquals(val3, (isStableEnabled ? 1.0 : 2.0)); + assertEquals(val3, (isServerWithStable ? 1.0 : 2.0)); assertEquals(val2, 1.0); assertEquals(val4, 2.0); @@ -616,17 +656,4 @@ } } } - - static final boolean isStableEnabled; - static { - HotSpotDiagnosticMXBean diagnostic - = ManagementFactoryHelper.getDiagnosticMXBean(); - VMOption tmp; - try { - tmp = diagnostic.getVMOption("FoldStableValues"); - } catch (IllegalArgumentException e) { - tmp = null; - } - isStableEnabled = (tmp == null ? false : Boolean.parseBoolean(tmp.getValue())); - } } diff -r d553e7400295 -r 6c9ff31edda0 hotspot/test/compiler/stable/TestStableFloat.java --- a/hotspot/test/compiler/stable/TestStableFloat.java Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/test/compiler/stable/TestStableFloat.java Wed Jul 05 19:52:15 2017 +0200 @@ -26,9 +26,11 @@ /* * @test TestStableFloat * @summary tests on stable fields and arrays - * @library /testlibrary - * @compile -XDignore.symbol.file TestStableFloat.java + * @library /testlibrary /testlibrary/whitebox + * @build TestStableFloat StableConfiguration sun.hotspot.WhiteBox + * @run main ClassFileInstaller sun.hotspot.WhiteBox sun.hotspot.WhiteBox$WhiteBoxPermission * @run main ClassFileInstaller + * java/lang/invoke/StableConfiguration * java/lang/invoke/TestStableFloat * java/lang/invoke/TestStableFloat$FloatStable * java/lang/invoke/TestStableFloat$StaticFloatStable @@ -48,46 +50,60 @@ * java/lang/invoke/TestStableFloat$NestedStableField3 * java/lang/invoke/TestStableFloat$NestedStableField3$A * java/lang/invoke/TestStableFloat$DefaultValue + * java/lang/invoke/TestStableFloat$DefaultStaticValue * java/lang/invoke/TestStableFloat$ObjectArrayLowerDim2 * * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions - * -XX:+UnlockDiagnosticVMOptions -XX:+FoldStableValues -XX:+UseCompressedOop - * -server -XX:-TieredCompilation -Xcomp + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -server -XX:-TieredCompilation + * -XX:+FoldStableValues + * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 + * java.lang.invoke.TestStableFloat + * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -server -XX:-TieredCompilation + * -XX:-FoldStableValues * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 * java.lang.invoke.TestStableFloat * * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions - * -XX:+UnlockDiagnosticVMOptions -XX:+FoldStableValues -XX:-UseCompressedOop - * -server -XX:-TieredCompilation -Xcomp + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1 + * -XX:+FoldStableValues + * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 + * java.lang.invoke.TestStableFloat + * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1 + * -XX:-FoldStableValues * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 * java.lang.invoke.TestStableFloat * * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions - * -XX:+UnlockDiagnosticVMOptions -XX:-FoldStableValues -XX:+UseCompressedOop - * -server -XX:-TieredCompilation -Xcomp + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -client -XX:-TieredCompilation + * -XX:+FoldStableValues * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 * java.lang.invoke.TestStableFloat - * * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions - * -XX:+UnlockDiagnosticVMOptions -XX:-FoldStableValues -XX:-UseCompressedOop - * -server -XX:-TieredCompilation -Xcomp + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -client -XX:-TieredCompilation + * -XX:-FoldStableValues * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 * java.lang.invoke.TestStableFloat */ package java.lang.invoke; -import com.sun.management.HotSpotDiagnosticMXBean; -import com.sun.management.VMOption; -import sun.management.ManagementFactoryHelper; import java.lang.reflect.InvocationTargetException; public class TestStableFloat { + static final boolean isStableEnabled = StableConfiguration.isStableEnabled; + static final boolean isServerWithStable = StableConfiguration.isServerWithStable; + public static void main(String[] args) throws Exception { - System.out.println("@Stable enabled: "+isStableEnabled); - System.out.println(); - run(DefaultValue.class); run(FloatStable.class); + run(DefaultStaticValue.class); run(StaticFloatStable.class); run(VolatileFloatStable.class); @@ -145,6 +161,21 @@ /* ==================================================== */ + static class DefaultStaticValue { + public static @Stable float v; + + public static final DefaultStaticValue c = new DefaultStaticValue(); + public static float get() { return c.v; } + public static void test() throws Exception { + float val1 = get(); + c.v = 1.0F; float val2 = get(); + assertEquals(val1, 0F); + assertEquals(val2, 1.0F); + } + } + + /* ==================================================== */ + static class StaticFloatStable { public static @Stable float v; @@ -188,20 +219,22 @@ c.v = new float[1]; c.v[0] = 1.0F; float val1 = get(); c.v[0] = 2.0F; float val2 = get(); assertEquals(val1, 1.0F); - assertEquals(val2, (isStableEnabled ? 1.0F : 2.0F)); + assertEquals(val2, (isServerWithStable ? 1.0F : 2.0F)); c.v = new float[1]; c.v[0] = 3.0F; float val3 = get(); - assertEquals(val3, (isStableEnabled ? 1.0F : 3.0F)); + assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1.0F : 2.0F) + : 3.0F)); } { c.v = new float[20]; c.v[10] = 1.0F; float val1 = get1(); c.v[10] = 2.0F; float val2 = get1(); assertEquals(val1, 1.0F); - assertEquals(val2, (isStableEnabled ? 1.0F : 2.0F)); + assertEquals(val2, (isServerWithStable ? 1.0F : 2.0F)); c.v = new float[20]; c.v[10] = 3.0F; float val3 = get1(); - assertEquals(val3, (isStableEnabled ? 1.0F : 3.0F)); + assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1.0F : 2.0F) + : 3.0F)); } { @@ -226,19 +259,21 @@ c.v = new float[1][1]; c.v[0][0] = 1.0F; float val1 = get(); c.v[0][0] = 2.0F; float val2 = get(); assertEquals(val1, 1.0F); - assertEquals(val2, (isStableEnabled ? 1.0F : 2.0F)); + assertEquals(val2, (isServerWithStable ? 1.0F : 2.0F)); c.v = new float[1][1]; c.v[0][0] = 3.0F; float val3 = get(); - assertEquals(val3, (isStableEnabled ? 1.0F : 3.0F)); + assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1.0F : 2.0F) + : 3.0F)); c.v[0] = new float[1]; c.v[0][0] = 4.0F; float val4 = get(); - assertEquals(val4, (isStableEnabled ? 1.0F : 4.0F)); + assertEquals(val4, (isStableEnabled ? (isServerWithStable ? 1.0F : 2.0F) + : 4.0F)); } { c.v = new float[1][1]; float[] val1 = get1(); c.v[0] = new float[1]; float[] val2 = get1(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { @@ -264,28 +299,31 @@ c.v = new float[1][1][1]; c.v[0][0][0] = 1.0F; float val1 = get(); c.v[0][0][0] = 2.0F; float val2 = get(); assertEquals(val1, 1.0F); - assertEquals(val2, (isStableEnabled ? 1.0F : 2.0F)); + assertEquals(val2, (isServerWithStable ? 1.0F : 2.0F)); c.v = new float[1][1][1]; c.v[0][0][0] = 3.0F; float val3 = get(); - assertEquals(val3, (isStableEnabled ? 1.0F : 3.0F)); + assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1.0F : 2.0F) + : 3.0F)); c.v[0] = new float[1][1]; c.v[0][0][0] = 4.0F; float val4 = get(); - assertEquals(val4, (isStableEnabled ? 1.0F : 4.0F)); + assertEquals(val4, (isStableEnabled ? (isServerWithStable ? 1.0F : 2.0F) + : 4.0F)); c.v[0][0] = new float[1]; c.v[0][0][0] = 5.0F; float val5 = get(); - assertEquals(val5, (isStableEnabled ? 1.0F : 5.0F)); + assertEquals(val5, (isStableEnabled ? (isServerWithStable ? 1.0F : 2.0F) + : 5.0F)); } { c.v = new float[1][1][1]; float[] val1 = get1(); c.v[0][0] = new float[1]; float[] val2 = get1(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { c.v = new float[1][1][1]; float[][] val1 = get2(); c.v[0] = new float[1][1]; float[][] val2 = get2(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { @@ -312,37 +350,41 @@ c.v = new float[1][1][1][1]; c.v[0][0][0][0] = 1.0F; float val1 = get(); c.v[0][0][0][0] = 2.0F; float val2 = get(); assertEquals(val1, 1.0F); - assertEquals(val2, (isStableEnabled ? 1.0F : 2.0F)); + assertEquals(val2, (isServerWithStable ? 1.0F : 2.0F)); c.v = new float[1][1][1][1]; c.v[0][0][0][0] = 3.0F; float val3 = get(); - assertEquals(val3, (isStableEnabled ? 1.0F : 3.0F)); + assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1.0F : 2.0F) + : 3.0F)); c.v[0] = new float[1][1][1]; c.v[0][0][0][0] = 4.0F; float val4 = get(); - assertEquals(val4, (isStableEnabled ? 1.0F : 4.0F)); + assertEquals(val4, (isStableEnabled ? (isServerWithStable ? 1.0F : 2.0F) + : 4.0F)); c.v[0][0] = new float[1][1]; c.v[0][0][0][0] = 5.0F; float val5 = get(); - assertEquals(val5, (isStableEnabled ? 1.0F : 5.0F)); + assertEquals(val5, (isStableEnabled ? (isServerWithStable ? 1.0F : 2.0F) + : 5.0F)); c.v[0][0][0] = new float[1]; c.v[0][0][0][0] = 6.0F; float val6 = get(); - assertEquals(val6, (isStableEnabled ? 1.0F : 6.0F)); + assertEquals(val6, (isStableEnabled ? (isServerWithStable ? 1.0F : 2.0F) + : 6.0F)); } { c.v = new float[1][1][1][1]; float[] val1 = get1(); c.v[0][0][0] = new float[1]; float[] val2 = get1(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { c.v = new float[1][1][1][1]; float[][] val1 = get2(); c.v[0][0] = new float[1][1]; float[][] val2 = get2(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { c.v = new float[1][1][1][1]; float[][][] val1 = get3(); c.v[0] = new float[1][1][1]; float[][][] val2 = get3(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { @@ -350,13 +392,11 @@ c.v = new float[1][1][1][1]; float[][][][] val2 = get4(); assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); } - } } /* ==================================================== */ // Dynamic Dim is higher than static - static class ObjectArrayLowerDim0 { public @Stable Object v; @@ -404,7 +444,7 @@ c.v = new float[1][1]; c.v[0] = new float[0]; float[] val1 = get1(); c.v[0] = new float[0]; float[] val2 = get1(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { @@ -440,14 +480,14 @@ c.v = new float[1][1][1]; c.v[0][0] = new float[0]; float[] val1 = get1(); c.v[0][0] = new float[0]; float[] val2 = get1(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { c.v = new float[1][1][1]; c.v[0] = new float[0][0]; float[][] val1 = get2(); c.v[0] = new float[0][0]; float[][] val2 = get2(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { @@ -582,7 +622,7 @@ elem.a = 2.0F; float val3 = get(); float val4 = get1(); assertEquals(val1, 1.0F); - assertEquals(val3, (isStableEnabled ? 1.0F : 2.0F)); + assertEquals(val3, (isServerWithStable ? 1.0F : 2.0F)); assertEquals(val2, 1.0F); assertEquals(val4, 2.0F); @@ -616,17 +656,4 @@ } } } - - static final boolean isStableEnabled; - static { - HotSpotDiagnosticMXBean diagnostic - = ManagementFactoryHelper.getDiagnosticMXBean(); - VMOption tmp; - try { - tmp = diagnostic.getVMOption("FoldStableValues"); - } catch (IllegalArgumentException e) { - tmp = null; - } - isStableEnabled = (tmp == null ? false : Boolean.parseBoolean(tmp.getValue())); - } } diff -r d553e7400295 -r 6c9ff31edda0 hotspot/test/compiler/stable/TestStableInt.java --- a/hotspot/test/compiler/stable/TestStableInt.java Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/test/compiler/stable/TestStableInt.java Wed Jul 05 19:52:15 2017 +0200 @@ -26,9 +26,11 @@ /* * @test TestStableInt * @summary tests on stable fields and arrays - * @library /testlibrary - * @compile -XDignore.symbol.file TestStableInt.java + * @library /testlibrary /testlibrary/whitebox + * @build TestStableInt StableConfiguration sun.hotspot.WhiteBox + * @run main ClassFileInstaller sun.hotspot.WhiteBox sun.hotspot.WhiteBox$WhiteBoxPermission * @run main ClassFileInstaller + * java/lang/invoke/StableConfiguration * java/lang/invoke/TestStableInt * java/lang/invoke/TestStableInt$IntStable * java/lang/invoke/TestStableInt$StaticIntStable @@ -48,46 +50,60 @@ * java/lang/invoke/TestStableInt$NestedStableField3 * java/lang/invoke/TestStableInt$NestedStableField3$A * java/lang/invoke/TestStableInt$DefaultValue + * java/lang/invoke/TestStableInt$DefaultStaticValue * java/lang/invoke/TestStableInt$ObjectArrayLowerDim2 * * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions - * -XX:+UnlockDiagnosticVMOptions -XX:+FoldStableValues -XX:+UseCompressedOop - * -server -XX:-TieredCompilation -Xcomp + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -server -XX:-TieredCompilation + * -XX:+FoldStableValues + * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 + * java.lang.invoke.TestStableInt + * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -server -XX:-TieredCompilation + * -XX:-FoldStableValues * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 * java.lang.invoke.TestStableInt * * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions - * -XX:+UnlockDiagnosticVMOptions -XX:+FoldStableValues -XX:-UseCompressedOop - * -server -XX:-TieredCompilation -Xcomp + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1 + * -XX:+FoldStableValues + * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 + * java.lang.invoke.TestStableInt + * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1 + * -XX:-FoldStableValues * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 * java.lang.invoke.TestStableInt * * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions - * -XX:+UnlockDiagnosticVMOptions -XX:-FoldStableValues -XX:+UseCompressedOop - * -server -XX:-TieredCompilation -Xcomp + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -client -XX:-TieredCompilation + * -XX:+FoldStableValues * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 * java.lang.invoke.TestStableInt - * * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions - * -XX:+UnlockDiagnosticVMOptions -XX:-FoldStableValues -XX:-UseCompressedOop - * -server -XX:-TieredCompilation -Xcomp + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -client -XX:-TieredCompilation + * -XX:-FoldStableValues * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 * java.lang.invoke.TestStableInt */ package java.lang.invoke; -import com.sun.management.HotSpotDiagnosticMXBean; -import com.sun.management.VMOption; -import sun.management.ManagementFactoryHelper; import java.lang.reflect.InvocationTargetException; public class TestStableInt { + static final boolean isStableEnabled = StableConfiguration.isStableEnabled; + static final boolean isServerWithStable = StableConfiguration.isServerWithStable; + public static void main(String[] args) throws Exception { - System.out.println("@Stable enabled: "+isStableEnabled); - System.out.println(); - run(DefaultValue.class); run(IntStable.class); + run(DefaultStaticValue.class); run(StaticIntStable.class); run(VolatileIntStable.class); @@ -145,6 +161,21 @@ /* ==================================================== */ + static class DefaultStaticValue { + public static @Stable int v; + + public static final DefaultStaticValue c = new DefaultStaticValue(); + public static int get() { return c.v; } + public static void test() throws Exception { + int val1 = get(); + c.v = 1; int val2 = get(); + assertEquals(val1, 0); + assertEquals(val2, 1); + } + } + + /* ==================================================== */ + static class StaticIntStable { public static @Stable int v; @@ -188,20 +219,22 @@ c.v = new int[1]; c.v[0] = 1; int val1 = get(); c.v[0] = 2; int val2 = get(); assertEquals(val1, 1); - assertEquals(val2, (isStableEnabled ? 1 : 2)); + assertEquals(val2, (isServerWithStable ? 1 : 2)); c.v = new int[1]; c.v[0] = 3; int val3 = get(); - assertEquals(val3, (isStableEnabled ? 1 : 3)); + assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1 : 2) + : 3)); } { c.v = new int[20]; c.v[10] = 1; int val1 = get1(); c.v[10] = 2; int val2 = get1(); assertEquals(val1, 1); - assertEquals(val2, (isStableEnabled ? 1 : 2)); + assertEquals(val2, (isServerWithStable ? 1 : 2)); c.v = new int[20]; c.v[10] = 3; int val3 = get1(); - assertEquals(val3, (isStableEnabled ? 1 : 3)); + assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1 : 2) + : 3)); } { @@ -226,19 +259,21 @@ c.v = new int[1][1]; c.v[0][0] = 1; int val1 = get(); c.v[0][0] = 2; int val2 = get(); assertEquals(val1, 1); - assertEquals(val2, (isStableEnabled ? 1 : 2)); + assertEquals(val2, (isServerWithStable ? 1 : 2)); c.v = new int[1][1]; c.v[0][0] = 3; int val3 = get(); - assertEquals(val3, (isStableEnabled ? 1 : 3)); + assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1 : 2) + : 3)); c.v[0] = new int[1]; c.v[0][0] = 4; int val4 = get(); - assertEquals(val4, (isStableEnabled ? 1 : 4)); + assertEquals(val4, (isStableEnabled ? (isServerWithStable ? 1 : 2) + : 4)); } { c.v = new int[1][1]; int[] val1 = get1(); c.v[0] = new int[1]; int[] val2 = get1(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { @@ -264,28 +299,31 @@ c.v = new int[1][1][1]; c.v[0][0][0] = 1; int val1 = get(); c.v[0][0][0] = 2; int val2 = get(); assertEquals(val1, 1); - assertEquals(val2, (isStableEnabled ? 1 : 2)); + assertEquals(val2, (isServerWithStable ? 1 : 2)); c.v = new int[1][1][1]; c.v[0][0][0] = 3; int val3 = get(); - assertEquals(val3, (isStableEnabled ? 1 : 3)); + assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1 : 2) + : 3)); c.v[0] = new int[1][1]; c.v[0][0][0] = 4; int val4 = get(); - assertEquals(val4, (isStableEnabled ? 1 : 4)); + assertEquals(val4, (isStableEnabled ? (isServerWithStable ? 1 : 2) + : 4)); c.v[0][0] = new int[1]; c.v[0][0][0] = 5; int val5 = get(); - assertEquals(val5, (isStableEnabled ? 1 : 5)); + assertEquals(val5, (isStableEnabled ? (isServerWithStable ? 1 : 2) + : 5)); } { c.v = new int[1][1][1]; int[] val1 = get1(); c.v[0][0] = new int[1]; int[] val2 = get1(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { c.v = new int[1][1][1]; int[][] val1 = get2(); c.v[0] = new int[1][1]; int[][] val2 = get2(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { @@ -312,37 +350,41 @@ c.v = new int[1][1][1][1]; c.v[0][0][0][0] = 1; int val1 = get(); c.v[0][0][0][0] = 2; int val2 = get(); assertEquals(val1, 1); - assertEquals(val2, (isStableEnabled ? 1 : 2)); + assertEquals(val2, (isServerWithStable ? 1 : 2)); c.v = new int[1][1][1][1]; c.v[0][0][0][0] = 3; int val3 = get(); - assertEquals(val3, (isStableEnabled ? 1 : 3)); + assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1 : 2) + : 3)); c.v[0] = new int[1][1][1]; c.v[0][0][0][0] = 4; int val4 = get(); - assertEquals(val4, (isStableEnabled ? 1 : 4)); + assertEquals(val4, (isStableEnabled ? (isServerWithStable ? 1 : 2) + : 4)); c.v[0][0] = new int[1][1]; c.v[0][0][0][0] = 5; int val5 = get(); - assertEquals(val5, (isStableEnabled ? 1 : 5)); + assertEquals(val5, (isStableEnabled ? (isServerWithStable ? 1 : 2) + : 5)); c.v[0][0][0] = new int[1]; c.v[0][0][0][0] = 6; int val6 = get(); - assertEquals(val6, (isStableEnabled ? 1 : 6)); + assertEquals(val6, (isStableEnabled ? (isServerWithStable ? 1 : 2) + : 6)); } { c.v = new int[1][1][1][1]; int[] val1 = get1(); c.v[0][0][0] = new int[1]; int[] val2 = get1(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { c.v = new int[1][1][1][1]; int[][] val1 = get2(); c.v[0][0] = new int[1][1]; int[][] val2 = get2(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { c.v = new int[1][1][1][1]; int[][][] val1 = get3(); c.v[0] = new int[1][1][1]; int[][][] val2 = get3(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { @@ -350,13 +392,11 @@ c.v = new int[1][1][1][1]; int[][][][] val2 = get4(); assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); } - } } /* ==================================================== */ // Dynamic Dim is higher than static - static class ObjectArrayLowerDim0 { public @Stable Object v; @@ -404,7 +444,7 @@ c.v = new int[1][1]; c.v[0] = new int[0]; int[] val1 = get1(); c.v[0] = new int[0]; int[] val2 = get1(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { @@ -440,14 +480,14 @@ c.v = new int[1][1][1]; c.v[0][0] = new int[0]; int[] val1 = get1(); c.v[0][0] = new int[0]; int[] val2 = get1(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { c.v = new int[1][1][1]; c.v[0] = new int[0][0]; int[][] val1 = get2(); c.v[0] = new int[0][0]; int[][] val2 = get2(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { @@ -582,7 +622,7 @@ elem.a = 2; int val3 = get(); int val4 = get1(); assertEquals(val1, 1); - assertEquals(val3, (isStableEnabled ? 1 : 2)); + assertEquals(val3, (isServerWithStable ? 1 : 2)); assertEquals(val2, 1); assertEquals(val4, 2); @@ -616,17 +656,4 @@ } } } - - static final boolean isStableEnabled; - static { - HotSpotDiagnosticMXBean diagnostic - = ManagementFactoryHelper.getDiagnosticMXBean(); - VMOption tmp; - try { - tmp = diagnostic.getVMOption("FoldStableValues"); - } catch (IllegalArgumentException e) { - tmp = null; - } - isStableEnabled = (tmp == null ? false : Boolean.parseBoolean(tmp.getValue())); - } } diff -r d553e7400295 -r 6c9ff31edda0 hotspot/test/compiler/stable/TestStableLong.java --- a/hotspot/test/compiler/stable/TestStableLong.java Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/test/compiler/stable/TestStableLong.java Wed Jul 05 19:52:15 2017 +0200 @@ -26,9 +26,11 @@ /* * @test TestStableLong * @summary tests on stable fields and arrays - * @library /testlibrary - * @compile -XDignore.symbol.file TestStableLong.java + * @library /testlibrary /testlibrary/whitebox + * @build TestStableLong StableConfiguration sun.hotspot.WhiteBox + * @run main ClassFileInstaller sun.hotspot.WhiteBox sun.hotspot.WhiteBox$WhiteBoxPermission * @run main ClassFileInstaller + * java/lang/invoke/StableConfiguration * java/lang/invoke/TestStableLong * java/lang/invoke/TestStableLong$LongStable * java/lang/invoke/TestStableLong$StaticLongStable @@ -48,46 +50,60 @@ * java/lang/invoke/TestStableLong$NestedStableField3 * java/lang/invoke/TestStableLong$NestedStableField3$A * java/lang/invoke/TestStableLong$DefaultValue + * java/lang/invoke/TestStableLong$DefaultStaticValue * java/lang/invoke/TestStableLong$ObjectArrayLowerDim2 * * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions - * -XX:+UnlockDiagnosticVMOptions -XX:+FoldStableValues -XX:+UseCompressedOop - * -server -XX:-TieredCompilation -Xcomp + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -server -XX:-TieredCompilation + * -XX:+FoldStableValues + * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 + * java.lang.invoke.TestStableLong + * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -server -XX:-TieredCompilation + * -XX:-FoldStableValues * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 * java.lang.invoke.TestStableLong * * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions - * -XX:+UnlockDiagnosticVMOptions -XX:+FoldStableValues -XX:-UseCompressedOop - * -server -XX:-TieredCompilation -Xcomp + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1 + * -XX:+FoldStableValues + * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 + * java.lang.invoke.TestStableLong + * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1 + * -XX:-FoldStableValues * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 * java.lang.invoke.TestStableLong * * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions - * -XX:+UnlockDiagnosticVMOptions -XX:-FoldStableValues -XX:+UseCompressedOop - * -server -XX:-TieredCompilation -Xcomp + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -client -XX:-TieredCompilation + * -XX:+FoldStableValues * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 * java.lang.invoke.TestStableLong - * * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions - * -XX:+UnlockDiagnosticVMOptions -XX:-FoldStableValues -XX:-UseCompressedOop - * -server -XX:-TieredCompilation -Xcomp + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -client -XX:-TieredCompilation + * -XX:-FoldStableValues * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 * java.lang.invoke.TestStableLong */ package java.lang.invoke; -import com.sun.management.HotSpotDiagnosticMXBean; -import com.sun.management.VMOption; -import sun.management.ManagementFactoryHelper; import java.lang.reflect.InvocationTargetException; public class TestStableLong { + static final boolean isStableEnabled = StableConfiguration.isStableEnabled; + static final boolean isServerWithStable = StableConfiguration.isServerWithStable; + public static void main(String[] args) throws Exception { - System.out.println("@Stable enabled: "+isStableEnabled); - System.out.println(); - run(DefaultValue.class); run(LongStable.class); + run(DefaultStaticValue.class); run(StaticLongStable.class); run(VolatileLongStable.class); @@ -145,6 +161,21 @@ /* ==================================================== */ + static class DefaultStaticValue { + public static @Stable long v; + + public static final DefaultStaticValue c = new DefaultStaticValue(); + public static long get() { return c.v; } + public static void test() throws Exception { + long val1 = get(); + c.v = 1L; long val2 = get(); + assertEquals(val1, 0); + assertEquals(val2, 1L); + } + } + + /* ==================================================== */ + static class StaticLongStable { public static @Stable long v; @@ -188,20 +219,22 @@ c.v = new long[1]; c.v[0] = 1; long val1 = get(); c.v[0] = 2; long val2 = get(); assertEquals(val1, 1); - assertEquals(val2, (isStableEnabled ? 1 : 2)); + assertEquals(val2, (isServerWithStable ? 1 : 2)); c.v = new long[1]; c.v[0] = 3; long val3 = get(); - assertEquals(val3, (isStableEnabled ? 1 : 3)); + assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1 : 2) + : 3)); } { c.v = new long[20]; c.v[10] = 1; long val1 = get1(); c.v[10] = 2; long val2 = get1(); assertEquals(val1, 1); - assertEquals(val2, (isStableEnabled ? 1 : 2)); + assertEquals(val2, (isServerWithStable ? 1 : 2)); c.v = new long[20]; c.v[10] = 3; long val3 = get1(); - assertEquals(val3, (isStableEnabled ? 1 : 3)); + assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1 : 2) + : 3)); } { @@ -226,19 +259,21 @@ c.v = new long[1][1]; c.v[0][0] = 1; long val1 = get(); c.v[0][0] = 2; long val2 = get(); assertEquals(val1, 1); - assertEquals(val2, (isStableEnabled ? 1 : 2)); + assertEquals(val2, (isServerWithStable ? 1 : 2)); c.v = new long[1][1]; c.v[0][0] = 3; long val3 = get(); - assertEquals(val3, (isStableEnabled ? 1 : 3)); + assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1 : 2) + : 3)); c.v[0] = new long[1]; c.v[0][0] = 4; long val4 = get(); - assertEquals(val4, (isStableEnabled ? 1 : 4)); + assertEquals(val4, (isStableEnabled ? (isServerWithStable ? 1 : 2) + : 4)); } { c.v = new long[1][1]; long[] val1 = get1(); c.v[0] = new long[1]; long[] val2 = get1(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { @@ -264,28 +299,31 @@ c.v = new long[1][1][1]; c.v[0][0][0] = 1; long val1 = get(); c.v[0][0][0] = 2; long val2 = get(); assertEquals(val1, 1); - assertEquals(val2, (isStableEnabled ? 1 : 2)); + assertEquals(val2, (isServerWithStable ? 1 : 2)); c.v = new long[1][1][1]; c.v[0][0][0] = 3; long val3 = get(); - assertEquals(val3, (isStableEnabled ? 1 : 3)); + assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1 : 2) + : 3)); c.v[0] = new long[1][1]; c.v[0][0][0] = 4; long val4 = get(); - assertEquals(val4, (isStableEnabled ? 1 : 4)); + assertEquals(val4, (isStableEnabled ? (isServerWithStable ? 1 : 2) + : 4)); c.v[0][0] = new long[1]; c.v[0][0][0] = 5; long val5 = get(); - assertEquals(val5, (isStableEnabled ? 1 : 5)); + assertEquals(val5, (isStableEnabled ? (isServerWithStable ? 1 : 2) + : 5)); } { c.v = new long[1][1][1]; long[] val1 = get1(); c.v[0][0] = new long[1]; long[] val2 = get1(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { c.v = new long[1][1][1]; long[][] val1 = get2(); c.v[0] = new long[1][1]; long[][] val2 = get2(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { @@ -312,37 +350,41 @@ c.v = new long[1][1][1][1]; c.v[0][0][0][0] = 1; long val1 = get(); c.v[0][0][0][0] = 2; long val2 = get(); assertEquals(val1, 1); - assertEquals(val2, (isStableEnabled ? 1 : 2)); + assertEquals(val2, (isServerWithStable ? 1 : 2)); c.v = new long[1][1][1][1]; c.v[0][0][0][0] = 3; long val3 = get(); - assertEquals(val3, (isStableEnabled ? 1 : 3)); + assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1 : 2) + : 3)); c.v[0] = new long[1][1][1]; c.v[0][0][0][0] = 4; long val4 = get(); - assertEquals(val4, (isStableEnabled ? 1 : 4)); + assertEquals(val4, (isStableEnabled ? (isServerWithStable ? 1 : 2) + : 4)); c.v[0][0] = new long[1][1]; c.v[0][0][0][0] = 5; long val5 = get(); - assertEquals(val5, (isStableEnabled ? 1 : 5)); + assertEquals(val5, (isStableEnabled ? (isServerWithStable ? 1 : 2) + : 5)); c.v[0][0][0] = new long[1]; c.v[0][0][0][0] = 6; long val6 = get(); - assertEquals(val6, (isStableEnabled ? 1 : 6)); + assertEquals(val6, (isStableEnabled ? (isServerWithStable ? 1 : 2) + : 6)); } { c.v = new long[1][1][1][1]; long[] val1 = get1(); c.v[0][0][0] = new long[1]; long[] val2 = get1(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { c.v = new long[1][1][1][1]; long[][] val1 = get2(); c.v[0][0] = new long[1][1]; long[][] val2 = get2(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { c.v = new long[1][1][1][1]; long[][][] val1 = get3(); c.v[0] = new long[1][1][1]; long[][][] val2 = get3(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { @@ -350,13 +392,11 @@ c.v = new long[1][1][1][1]; long[][][][] val2 = get4(); assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); } - } } /* ==================================================== */ // Dynamic Dim is higher than static - static class ObjectArrayLowerDim0 { public @Stable Object v; @@ -404,7 +444,7 @@ c.v = new long[1][1]; c.v[0] = new long[0]; long[] val1 = get1(); c.v[0] = new long[0]; long[] val2 = get1(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { @@ -440,14 +480,14 @@ c.v = new long[1][1][1]; c.v[0][0] = new long[0]; long[] val1 = get1(); c.v[0][0] = new long[0]; long[] val2 = get1(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { c.v = new long[1][1][1]; c.v[0] = new long[0][0]; long[][] val1 = get2(); c.v[0] = new long[0][0]; long[][] val2 = get2(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { @@ -582,7 +622,7 @@ elem.a = 2; long val3 = get(); long val4 = get1(); assertEquals(val1, 1); - assertEquals(val3, (isStableEnabled ? 1 : 2)); + assertEquals(val3, (isServerWithStable ? 1 : 2)); assertEquals(val2, 1); assertEquals(val4, 2); @@ -616,17 +656,4 @@ } } } - - static final boolean isStableEnabled; - static { - HotSpotDiagnosticMXBean diagnostic - = ManagementFactoryHelper.getDiagnosticMXBean(); - VMOption tmp; - try { - tmp = diagnostic.getVMOption("FoldStableValues"); - } catch (IllegalArgumentException e) { - tmp = null; - } - isStableEnabled = (tmp == null ? false : Boolean.parseBoolean(tmp.getValue())); - } } diff -r d553e7400295 -r 6c9ff31edda0 hotspot/test/compiler/stable/TestStableObject.java --- a/hotspot/test/compiler/stable/TestStableObject.java Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/test/compiler/stable/TestStableObject.java Wed Jul 05 19:52:15 2017 +0200 @@ -26,9 +26,11 @@ /* * @test TestStableObject * @summary tests on stable fields and arrays - * @library /testlibrary - * @compile -XDignore.symbol.file TestStableObject.java + * @library /testlibrary /testlibrary/whitebox + * @build TestStableObject StableConfiguration sun.hotspot.WhiteBox + * @run main ClassFileInstaller sun.hotspot.WhiteBox sun.hotspot.WhiteBox$WhiteBoxPermission * @run main ClassFileInstaller + * java/lang/invoke/StableConfiguration * java/lang/invoke/TestStableObject * java/lang/invoke/TestStableObject$ObjectStable * java/lang/invoke/TestStableObject$StaticObjectStable @@ -49,46 +51,60 @@ * java/lang/invoke/TestStableObject$NestedStableField3$A * java/lang/invoke/TestStableObject$Values * java/lang/invoke/TestStableObject$DefaultValue + * java/lang/invoke/TestStableObject$DefaultStaticValue * java/lang/invoke/TestStableObject$ObjectArrayLowerDim2 * * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions - * -XX:+UnlockDiagnosticVMOptions -XX:+FoldStableValues -XX:+UseCompressedOop - * -server -XX:-TieredCompilation -Xcomp + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -server -XX:-TieredCompilation + * -XX:+FoldStableValues + * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 + * java.lang.invoke.TestStableObject + * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -server -XX:-TieredCompilation + * -XX:-FoldStableValues * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 * java.lang.invoke.TestStableObject * * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions - * -XX:+UnlockDiagnosticVMOptions -XX:+FoldStableValues -XX:-UseCompressedOop - * -server -XX:-TieredCompilation -Xcomp + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1 + * -XX:+FoldStableValues + * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 + * java.lang.invoke.TestStableObject + * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1 + * -XX:-FoldStableValues * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 * java.lang.invoke.TestStableObject * * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions - * -XX:+UnlockDiagnosticVMOptions -XX:-FoldStableValues -XX:+UseCompressedOop - * -server -XX:-TieredCompilation -Xcomp + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -client -XX:-TieredCompilation + * -XX:+FoldStableValues * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 * java.lang.invoke.TestStableObject - * * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions - * -XX:+UnlockDiagnosticVMOptions -XX:-FoldStableValues -XX:-UseCompressedOop - * -server -XX:-TieredCompilation -Xcomp + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -client -XX:-TieredCompilation + * -XX:-FoldStableValues * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 * java.lang.invoke.TestStableObject */ package java.lang.invoke; -import com.sun.management.HotSpotDiagnosticMXBean; -import com.sun.management.VMOption; -import sun.management.ManagementFactoryHelper; import java.lang.reflect.InvocationTargetException; public class TestStableObject { + static final boolean isStableEnabled = StableConfiguration.isStableEnabled; + static final boolean isServerWithStable = StableConfiguration.isServerWithStable; + public static void main(String[] args) throws Exception { - System.out.println("@Stable enabled: "+isStableEnabled); - System.out.println(); - run(DefaultValue.class); run(ObjectStable.class); + run(DefaultStaticValue.class); run(StaticObjectStable.class); run(VolatileObjectStable.class); @@ -148,6 +164,21 @@ /* ==================================================== */ + static class DefaultStaticValue { + public static @Stable Object v; + + public static final DefaultStaticValue c = new DefaultStaticValue(); + public static Object get() { return c.v; } + public static void test() throws Exception { + Object val1 = get(); + c.v = Values.A; Object val2 = get(); + assertEquals(val1, null); + assertEquals(val2, Values.A); + } + } + + /* ==================================================== */ + static class StaticObjectStable { public static @Stable Values v; @@ -191,20 +222,22 @@ c.v = new Object[1]; c.v[0] = Values.A; Object val1 = get(); c.v[0] = Values.B; Object val2 = get(); assertEquals(val1, Values.A); - assertEquals(val2, (isStableEnabled ? Values.A : Values.B)); + assertEquals(val2, (isServerWithStable ? Values.A : Values.B)); c.v = new Object[1]; c.v[0] = Values.C; Object val3 = get(); - assertEquals(val3, (isStableEnabled ? Values.A : Values.C)); + assertEquals(val3, (isStableEnabled ? (isServerWithStable ? Values.A : Values.B) + : Values.C)); } { c.v = new Object[20]; c.v[10] = Values.A; Object val1 = get1(); c.v[10] = Values.B; Object val2 = get1(); assertEquals(val1, Values.A); - assertEquals(val2, (isStableEnabled ? Values.A : Values.B)); + assertEquals(val2, (isServerWithStable ? Values.A : Values.B)); c.v = new Object[20]; c.v[10] = Values.C; Object val3 = get1(); - assertEquals(val3, (isStableEnabled ? Values.A : Values.C)); + assertEquals(val3, (isStableEnabled ? (isServerWithStable ? Values.A : Values.B) + : Values.C)); } { @@ -229,19 +262,21 @@ c.v = new Object[1][1]; c.v[0][0] = Values.A; Object val1 = get(); c.v[0][0] = Values.B; Object val2 = get(); assertEquals(val1, Values.A); - assertEquals(val2, (isStableEnabled ? Values.A : Values.B)); + assertEquals(val2, (isServerWithStable ? Values.A : Values.B)); c.v = new Object[1][1]; c.v[0][0] = Values.C; Object val3 = get(); - assertEquals(val3, (isStableEnabled ? Values.A : Values.C)); + assertEquals(val3, (isStableEnabled ? (isServerWithStable ? Values.A : Values.B) + : Values.C)); c.v[0] = new Object[1]; c.v[0][0] = Values.D; Object val4 = get(); - assertEquals(val4, (isStableEnabled ? Values.A : Values.D)); + assertEquals(val4, (isStableEnabled ? (isServerWithStable ? Values.A : Values.B) + : Values.D)); } { c.v = new Object[1][1]; Object[] val1 = get1(); c.v[0] = new Object[1]; Object[] val2 = get1(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { @@ -267,28 +302,31 @@ c.v = new Object[1][1][1]; c.v[0][0][0] = Values.A; Object val1 = get(); c.v[0][0][0] = Values.B; Object val2 = get(); assertEquals(val1, Values.A); - assertEquals(val2, (isStableEnabled ? Values.A : Values.B)); + assertEquals(val2, (isServerWithStable ? Values.A : Values.B)); c.v = new Object[1][1][1]; c.v[0][0][0] = Values.C; Object val3 = get(); - assertEquals(val3, (isStableEnabled ? Values.A : Values.C)); + assertEquals(val3, (isStableEnabled ? (isServerWithStable ? Values.A : Values.B) + : Values.C)); c.v[0] = new Object[1][1]; c.v[0][0][0] = Values.D; Object val4 = get(); - assertEquals(val4, (isStableEnabled ? Values.A : Values.D)); + assertEquals(val4, (isStableEnabled ? (isServerWithStable ? Values.A : Values.B) + : Values.D)); c.v[0][0] = new Object[1]; c.v[0][0][0] = Values.E; Object val5 = get(); - assertEquals(val5, (isStableEnabled ? Values.A : Values.E)); + assertEquals(val5, (isStableEnabled ? (isServerWithStable ? Values.A : Values.B) + : Values.E)); } { c.v = new Object[1][1][1]; Object[] val1 = get1(); c.v[0][0] = new Object[1]; Object[] val2 = get1(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { c.v = new Object[1][1][1]; Object[][] val1 = get2(); c.v[0] = new Object[1][1]; Object[][] val2 = get2(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { @@ -315,37 +353,41 @@ c.v = new Object[1][1][1][1]; c.v[0][0][0][0] = Values.A; Object val1 = get(); c.v[0][0][0][0] = Values.B; Object val2 = get(); assertEquals(val1, Values.A); - assertEquals(val2, (isStableEnabled ? Values.A : Values.B)); + assertEquals(val2, (isServerWithStable ? Values.A : Values.B)); c.v = new Object[1][1][1][1]; c.v[0][0][0][0] = Values.C; Object val3 = get(); - assertEquals(val3, (isStableEnabled ? Values.A : Values.C)); + assertEquals(val3, (isStableEnabled ? (isServerWithStable ? Values.A : Values.B) + : Values.C)); c.v[0] = new Object[1][1][1]; c.v[0][0][0][0] = Values.D; Object val4 = get(); - assertEquals(val4, (isStableEnabled ? Values.A : Values.D)); + assertEquals(val4, (isStableEnabled ? (isServerWithStable ? Values.A : Values.B) + : Values.D)); c.v[0][0] = new Object[1][1]; c.v[0][0][0][0] = Values.E; Object val5 = get(); - assertEquals(val5, (isStableEnabled ? Values.A : Values.E)); + assertEquals(val5, (isStableEnabled ? (isServerWithStable ? Values.A : Values.B) + : Values.E)); c.v[0][0][0] = new Object[1]; c.v[0][0][0][0] = Values.F; Object val6 = get(); - assertEquals(val6, (isStableEnabled ? Values.A : Values.F)); + assertEquals(val6, (isStableEnabled ? (isServerWithStable ? Values.A : Values.B) + : Values.F)); } { c.v = new Object[1][1][1][1]; Object[] val1 = get1(); c.v[0][0][0] = new Object[1]; Object[] val2 = get1(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { c.v = new Object[1][1][1][1]; Object[][] val1 = get2(); c.v[0][0] = new Object[1][1]; Object[][] val2 = get2(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { c.v = new Object[1][1][1][1]; Object[][][] val1 = get3(); c.v[0] = new Object[1][1][1]; Object[][][] val2 = get3(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { @@ -353,13 +395,11 @@ c.v = new Object[1][1][1][1]; Object[][][][] val2 = get4(); assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); } - } } /* ==================================================== */ // Dynamic Dim is higher than static - static class ObjectArrayLowerDim0 { public @Stable Object v; @@ -407,7 +447,7 @@ c.v = new Object[1][1]; c.v[0] = new Object[0]; Object[] val1 = get1(); c.v[0] = new Object[0]; Object[] val2 = get1(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { @@ -443,14 +483,14 @@ c.v = new Object[1][1][1]; c.v[0][0] = new Object[0]; Object[] val1 = get1(); c.v[0][0] = new Object[0]; Object[] val2 = get1(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { c.v = new Object[1][1][1]; c.v[0] = new Object[0][0]; Object[][] val1 = get2(); c.v[0] = new Object[0][0]; Object[][] val2 = get2(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { @@ -585,7 +625,7 @@ elem.a = Values.B; Object val3 = get(); Object val4 = get1(); assertEquals(val1, Values.A); - assertEquals(val3, (isStableEnabled ? Values.A : Values.B)); + assertEquals(val3, (isServerWithStable ? Values.A : Values.B)); assertEquals(val2, Values.A); assertEquals(val4, Values.B); @@ -619,17 +659,4 @@ } } } - - static final boolean isStableEnabled; - static { - HotSpotDiagnosticMXBean diagnostic - = ManagementFactoryHelper.getDiagnosticMXBean(); - VMOption tmp; - try { - tmp = diagnostic.getVMOption("FoldStableValues"); - } catch (IllegalArgumentException e) { - tmp = null; - } - isStableEnabled = (tmp == null ? false : Boolean.parseBoolean(tmp.getValue())); - } } diff -r d553e7400295 -r 6c9ff31edda0 hotspot/test/compiler/stable/TestStableShort.java --- a/hotspot/test/compiler/stable/TestStableShort.java Wed Jul 30 11:49:21 2014 -0700 +++ b/hotspot/test/compiler/stable/TestStableShort.java Wed Jul 05 19:52:15 2017 +0200 @@ -26,9 +26,11 @@ /* * @test TestStableShort * @summary tests on stable fields and arrays - * @library /testlibrary - * @compile -XDignore.symbol.file TestStableShort.java + * @library /testlibrary /testlibrary/whitebox + * @build TestStableShort StableConfiguration sun.hotspot.WhiteBox + * @run main ClassFileInstaller sun.hotspot.WhiteBox sun.hotspot.WhiteBox$WhiteBoxPermission * @run main ClassFileInstaller + * java/lang/invoke/StableConfiguration * java/lang/invoke/TestStableShort * java/lang/invoke/TestStableShort$ShortStable * java/lang/invoke/TestStableShort$StaticShortStable @@ -48,46 +50,60 @@ * java/lang/invoke/TestStableShort$NestedStableField3 * java/lang/invoke/TestStableShort$NestedStableField3$A * java/lang/invoke/TestStableShort$DefaultValue + * java/lang/invoke/TestStableShort$DefaultStaticValue * java/lang/invoke/TestStableShort$ObjectArrayLowerDim2 * * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions - * -XX:+UnlockDiagnosticVMOptions -XX:+FoldStableValues -XX:+UseCompressedOop - * -server -XX:-TieredCompilation -Xcomp + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -server -XX:-TieredCompilation + * -XX:+FoldStableValues + * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 + * java.lang.invoke.TestStableShort + * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -server -XX:-TieredCompilation + * -XX:-FoldStableValues * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 * java.lang.invoke.TestStableShort * * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions - * -XX:+UnlockDiagnosticVMOptions -XX:+FoldStableValues -XX:-UseCompressedOop - * -server -XX:-TieredCompilation -Xcomp + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1 + * -XX:+FoldStableValues + * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 + * java.lang.invoke.TestStableShort + * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1 + * -XX:-FoldStableValues * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 * java.lang.invoke.TestStableShort * * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions - * -XX:+UnlockDiagnosticVMOptions -XX:-FoldStableValues -XX:+UseCompressedOop - * -server -XX:-TieredCompilation -Xcomp + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -client -XX:-TieredCompilation + * -XX:+FoldStableValues * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 * java.lang.invoke.TestStableShort - * * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions - * -XX:+UnlockDiagnosticVMOptions -XX:-FoldStableValues -XX:-UseCompressedOop - * -server -XX:-TieredCompilation -Xcomp + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp + * -client -XX:-TieredCompilation + * -XX:-FoldStableValues * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 * java.lang.invoke.TestStableShort */ package java.lang.invoke; -import com.sun.management.HotSpotDiagnosticMXBean; -import com.sun.management.VMOption; -import sun.management.ManagementFactoryHelper; import java.lang.reflect.InvocationTargetException; public class TestStableShort { + static final boolean isStableEnabled = StableConfiguration.isStableEnabled; + static final boolean isServerWithStable = StableConfiguration.isServerWithStable; + public static void main(String[] args) throws Exception { - System.out.println("@Stable enabled: "+isStableEnabled); - System.out.println(); - run(DefaultValue.class); run(ShortStable.class); + run(DefaultStaticValue.class); run(StaticShortStable.class); run(VolatileShortStable.class); @@ -145,6 +161,21 @@ /* ==================================================== */ + static class DefaultStaticValue { + public static @Stable short v; + + public static final DefaultStaticValue c = new DefaultStaticValue(); + public static short get() { return c.v; } + public static void test() throws Exception { + short val1 = get(); + c.v = 1; short val2 = get(); + assertEquals(val1, 0); + assertEquals(val2, 1); + } + } + + /* ==================================================== */ + static class StaticShortStable { public static @Stable short v; @@ -188,20 +219,22 @@ c.v = new short[1]; c.v[0] = 1; short val1 = get(); c.v[0] = 2; short val2 = get(); assertEquals(val1, 1); - assertEquals(val2, (isStableEnabled ? 1 : 2)); + assertEquals(val2, (isServerWithStable ? 1 : 2)); c.v = new short[1]; c.v[0] = 3; short val3 = get(); - assertEquals(val3, (isStableEnabled ? 1 : 3)); + assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1 : 2) + : 3)); } { c.v = new short[20]; c.v[10] = 1; short val1 = get1(); c.v[10] = 2; short val2 = get1(); assertEquals(val1, 1); - assertEquals(val2, (isStableEnabled ? 1 : 2)); + assertEquals(val2, (isServerWithStable ? 1 : 2)); c.v = new short[20]; c.v[10] = 3; short val3 = get1(); - assertEquals(val3, (isStableEnabled ? 1 : 3)); + assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1 : 2) + : 3)); } { @@ -226,19 +259,21 @@ c.v = new short[1][1]; c.v[0][0] = 1; short val1 = get(); c.v[0][0] = 2; short val2 = get(); assertEquals(val1, 1); - assertEquals(val2, (isStableEnabled ? 1 : 2)); + assertEquals(val2, (isServerWithStable ? 1 : 2)); c.v = new short[1][1]; c.v[0][0] = 3; short val3 = get(); - assertEquals(val3, (isStableEnabled ? 1 : 3)); + assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1 : 2) + : 3)); c.v[0] = new short[1]; c.v[0][0] = 4; short val4 = get(); - assertEquals(val4, (isStableEnabled ? 1 : 4)); + assertEquals(val4, (isStableEnabled ? (isServerWithStable ? 1 : 2) + : 4)); } { c.v = new short[1][1]; short[] val1 = get1(); c.v[0] = new short[1]; short[] val2 = get1(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { @@ -264,28 +299,31 @@ c.v = new short[1][1][1]; c.v[0][0][0] = 1; short val1 = get(); c.v[0][0][0] = 2; short val2 = get(); assertEquals(val1, 1); - assertEquals(val2, (isStableEnabled ? 1 : 2)); + assertEquals(val2, (isServerWithStable ? 1 : 2)); c.v = new short[1][1][1]; c.v[0][0][0] = 3; short val3 = get(); - assertEquals(val3, (isStableEnabled ? 1 : 3)); + assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1 : 2) + : 3)); c.v[0] = new short[1][1]; c.v[0][0][0] = 4; short val4 = get(); - assertEquals(val4, (isStableEnabled ? 1 : 4)); + assertEquals(val4, (isStableEnabled ? (isServerWithStable ? 1 : 2) + : 4)); c.v[0][0] = new short[1]; c.v[0][0][0] = 5; short val5 = get(); - assertEquals(val5, (isStableEnabled ? 1 : 5)); + assertEquals(val5, (isStableEnabled ? (isServerWithStable ? 1 : 2) + : 5)); } { c.v = new short[1][1][1]; short[] val1 = get1(); c.v[0][0] = new short[1]; short[] val2 = get1(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { c.v = new short[1][1][1]; short[][] val1 = get2(); c.v[0] = new short[1][1]; short[][] val2 = get2(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { @@ -312,37 +350,41 @@ c.v = new short[1][1][1][1]; c.v[0][0][0][0] = 1; short val1 = get(); c.v[0][0][0][0] = 2; short val2 = get(); assertEquals(val1, 1); - assertEquals(val2, (isStableEnabled ? 1 : 2)); + assertEquals(val2, (isServerWithStable ? 1 : 2)); c.v = new short[1][1][1][1]; c.v[0][0][0][0] = 3; short val3 = get(); - assertEquals(val3, (isStableEnabled ? 1 : 3)); + assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1 : 2) + : 3)); c.v[0] = new short[1][1][1]; c.v[0][0][0][0] = 4; short val4 = get(); - assertEquals(val4, (isStableEnabled ? 1 : 4)); + assertEquals(val4, (isStableEnabled ? (isServerWithStable ? 1 : 2) + : 4)); c.v[0][0] = new short[1][1]; c.v[0][0][0][0] = 5; short val5 = get(); - assertEquals(val5, (isStableEnabled ? 1 : 5)); + assertEquals(val5, (isStableEnabled ? (isServerWithStable ? 1 : 2) + : 5)); c.v[0][0][0] = new short[1]; c.v[0][0][0][0] = 6; short val6 = get(); - assertEquals(val6, (isStableEnabled ? 1 : 6)); + assertEquals(val6, (isStableEnabled ? (isServerWithStable ? 1 : 2) + : 6)); } { c.v = new short[1][1][1][1]; short[] val1 = get1(); c.v[0][0][0] = new short[1]; short[] val2 = get1(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { c.v = new short[1][1][1][1]; short[][] val1 = get2(); c.v[0][0] = new short[1][1]; short[][] val2 = get2(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { c.v = new short[1][1][1][1]; short[][][] val1 = get3(); c.v[0] = new short[1][1][1]; short[][][] val2 = get3(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { @@ -350,13 +392,11 @@ c.v = new short[1][1][1][1]; short[][][][] val2 = get4(); assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); } - } } /* ==================================================== */ // Dynamic Dim is higher than static - static class ObjectArrayLowerDim0 { public @Stable Object v; @@ -404,7 +444,7 @@ c.v = new short[1][1]; c.v[0] = new short[0]; short[] val1 = get1(); c.v[0] = new short[0]; short[] val2 = get1(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { @@ -440,14 +480,14 @@ c.v = new short[1][1][1]; c.v[0][0] = new short[0]; short[] val1 = get1(); c.v[0][0] = new short[0]; short[] val2 = get1(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { c.v = new short[1][1][1]; c.v[0] = new short[0][0]; short[][] val1 = get2(); c.v[0] = new short[0][0]; short[][] val2 = get2(); - assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); + assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); } { @@ -582,7 +622,7 @@ elem.a = 2; short val3 = get(); short val4 = get1(); assertEquals(val1, 1); - assertEquals(val3, (isStableEnabled ? 1 : 2)); + assertEquals(val3, (isServerWithStable ? 1 : 2)); assertEquals(val2, 1); assertEquals(val4, 2); @@ -616,17 +656,4 @@ } } } - - static final boolean isStableEnabled; - static { - HotSpotDiagnosticMXBean diagnostic - = ManagementFactoryHelper.getDiagnosticMXBean(); - VMOption tmp; - try { - tmp = diagnostic.getVMOption("FoldStableValues"); - } catch (IllegalArgumentException e) { - tmp = null; - } - isStableEnabled = (tmp == null ? false : Boolean.parseBoolean(tmp.getValue())); - } } diff -r d553e7400295 -r 6c9ff31edda0 hotspot/test/compiler/uncommontrap/TestSpecTrapClassUnloading.java --- a/hotspot/test/compiler/uncommontrap/TestSpecTrapClassUnloading.java Wed Jul 30 11:49:21 2014 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,97 +0,0 @@ -/* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/* - * @test - * @bug 8031752 - * @summary speculative traps need to be cleaned up at GC - * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-UseOnStackReplacement -XX:-BackgroundCompilation -XX:+UseTypeSpeculation -XX:TypeProfileLevel=222 -XX:CompileCommand=exclude,java.lang.reflect.Method::invoke -XX:CompileCommand=exclude,sun.reflect.DelegatingMethodAccessorImpl::invoke -Xmx512M TestSpecTrapClassUnloading - * - */ - -import java.lang.reflect.Method; - -public class TestSpecTrapClassUnloading { - static class B { - final public boolean m(Object o) { - if (o.getClass() == B.class) { - return true; - } - return false; - } - } - - static class MemoryChunk { - MemoryChunk other; - long[] array; - MemoryChunk(MemoryChunk other) { - this.other = other; - array = new long[1024 * 1024 * 1024]; - } - } - - static void m1(B b, Object o) { - b.m(o); - } - - static void m2(B b, Object o) { - b.m(o); - } - - public static void main(String[] args) throws Exception { - Method m = B.class.getMethod("m", Object.class); - Object o = new Object(); - B b = new B(); - - // add speculative trap in B.m() for m1 - for (int i = 0; i < 20000; i++) { - m1(b, b); - } - m1(b, o); - - // add speculative trap in B.m() for code generated by reflection - for (int i = 0; i < 20000; i++) { - m.invoke(b, b); - } - m.invoke(b, o); - - m = null; - - // add speculative trap in B.m() for m2 - for (int i = 0; i < 20000; i++) { - m2(b, b); - } - m2(b, o); - - // Exhaust memory which causes the code generated by - // reflection to be unloaded but B.m() is not. - MemoryChunk root = null; - try { - while (true) { - root = new MemoryChunk(root); - } - } catch(OutOfMemoryError e) { - root = null; - } - } -} diff -r d553e7400295 -r 6c9ff31edda0 hotspot/test/runtime/CommandLine/TraceExceptionsTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/runtime/CommandLine/TraceExceptionsTest.java Wed Jul 05 19:52:15 2017 +0200 @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8048933 + * @summary TraceExceptions output should have the exception message - useful for ClassNotFoundExceptions especially + * @library /testlibrary + */ + +import com.oracle.java.testlibrary.*; + +public class TraceExceptionsTest { + public static void main(String[] args) throws Exception { + + if (!Platform.isDebugBuild()) { + System.out.println("Skip the test on product builds since XX:+TraceExceptions is not available on product builds"); + return; + } + + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder( + "-XX:+TraceExceptions", "NoClassFound"); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldContain(""); + output.shouldNotContain(""); + output.shouldHaveExitValue(1); + } +} diff -r d553e7400295 -r 6c9ff31edda0 jdk/.hgtags --- a/jdk/.hgtags Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/.hgtags Wed Jul 05 19:52:15 2017 +0200 @@ -266,3 +266,4 @@ 2df45ac1bf491278f38c12e0dfbeebadb6c54c8c jdk9-b21 85bcf0f99edc08873614afbe5a5563e13ce13c83 jdk9-b22 9febf9dbc0a4b15323f2dbd29931cfbf086332b4 jdk9-b23 +875450e7ef8dde8f59db662ec1351ea30b8cb35d jdk9-b24 diff -r d553e7400295 -r 6c9ff31edda0 jdk/src/share/classes/com/sun/jndi/toolkit/corba/CorbaUtils.java --- a/jdk/src/share/classes/com/sun/jndi/toolkit/corba/CorbaUtils.java Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/src/share/classes/com/sun/jndi/toolkit/corba/CorbaUtils.java Wed Jul 05 19:52:15 2017 +0200 @@ -55,7 +55,6 @@ * Returns the CORBA object reference associated with a Remote * object by using the javax.rmi.CORBA package. *

- * Use reflection to avoid hard dependencies on javax.rmi.CORBA package. * This method effective does the following: *

       * java.lang.Object stub;
diff -r d553e7400295 -r 6c9ff31edda0 jdk/src/share/classes/com/sun/security/auth/module/Krb5LoginModule.java
--- a/jdk/src/share/classes/com/sun/security/auth/module/Krb5LoginModule.java	Wed Jul 30 11:49:21 2014 -0700
+++ b/jdk/src/share/classes/com/sun/security/auth/module/Krb5LoginModule.java	Wed Jul 05 19:52:15 2017 +0200
@@ -33,7 +33,10 @@
 import java.util.*;
 
 import javax.security.auth.*;
-import javax.security.auth.kerberos.*;
+import javax.security.auth.kerberos.KerberosTicket;
+import javax.security.auth.kerberos.KerberosPrincipal;
+import javax.security.auth.kerberos.KerberosKey;
+import javax.security.auth.kerberos.KeyTab;
 import javax.security.auth.callback.*;
 import javax.security.auth.login.*;
 import javax.security.auth.spi.*;
diff -r d553e7400295 -r 6c9ff31edda0 jdk/src/share/classes/com/sun/security/jgss/ExtendedGSSContext.java
--- a/jdk/src/share/classes/com/sun/security/jgss/ExtendedGSSContext.java	Wed Jul 30 11:49:21 2014 -0700
+++ b/jdk/src/share/classes/com/sun/security/jgss/ExtendedGSSContext.java	Wed Jul 05 19:52:15 2017 +0200
@@ -36,33 +36,7 @@
 public interface ExtendedGSSContext extends GSSContext {
     /**
      * Return the mechanism-specific attribute associated with {@code type}.
-     * 

- * For each supported attribute type, the type for the output are - * defined below. - *
    - *
  1. {@code KRB5_GET_TKT_FLAGS}: - * the returned object is a boolean array for the service ticket flags, - * which is long enough to contain all true bits. This means if - * the user wants to get the n'th bit but the length of the - * returned array is less than n, it is regarded as false. - *
  2. {@code KRB5_GET_SESSION_KEY}: - * the returned object is an instance of {@link java.security.Key}, - * which has the following properties: - *
      - *
    • Algorithm: enctype as a string, where - * enctype is defined in RFC 3961, section 8. - *
    • Format: "RAW" - *
    • Encoded form: the raw key bytes, not in any ASN.1 encoding - *
    - *
  3. {@code KRB5_GET_AUTHZ_DATA}: - * the returned object is an array of - * {@link com.sun.security.jgss.AuthorizationDataEntry}, or null if the - * optional field is missing in the service ticket. - *
  4. {@code KRB5_GET_AUTHTIME}: - * the returned object is a String object in the standard KerberosTime - * format defined in RFC 4120 5.2.3 - *
- * + *

* If there is a security manager, an {@link InquireSecContextPermission} * with the name {@code type.mech} must be granted. Otherwise, this could * result in a {@link SecurityException}.

@@ -97,6 +71,7 @@ * @throws SecurityException if a security manager exists and a proper * {@link InquireSecContextPermission} is not granted. * @see InquireSecContextPermission + * @see InquireType */ public Object inquireSecContext(InquireType type) throws GSSException; diff -r d553e7400295 -r 6c9ff31edda0 jdk/src/share/classes/com/sun/security/jgss/InquireType.java --- a/jdk/src/share/classes/com/sun/security/jgss/InquireType.java Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/src/share/classes/com/sun/security/jgss/InquireType.java Wed Jul 05 19:52:15 2017 +0200 @@ -32,13 +32,38 @@ @jdk.Exported public enum InquireType { /** - * Attribute type for retrieving the session key of an - * established Kerberos 5 security context. + * Attribute type for retrieving the session key of an established + * Kerberos 5 security context. The returned object is an instance of + * {@link java.security.Key}, which has the following properties: + *

    + *
  • Algorithm: enctype as a string, where + * enctype is defined in RFC 3961, section 8. + *
  • Format: "RAW" + *
  • Encoded form: the raw key bytes, not in any ASN.1 encoding + *
+ * @deprecated as of 1.9, replaced by {@link #KRB5_GET_SESSION_KEY_EX} + * which returns an instance of + * {@link sun.security.jgss.krb5.Krb5Context.EncryptionKey} + * that implements the {@link javax.crypto.SecretKey} interface and + * has similar methods with {@link javax.security.auth.kerberos.KerberosKey}. */ + @Deprecated KRB5_GET_SESSION_KEY, /** + * Attribute type for retrieving the session key of an + * established Kerberos 5 security context. The return value is an + * instance of {@link javax.security.auth.kerberos.EncryptionKey}. + * + * @since 1.9 + */ + KRB5_GET_SESSION_KEY_EX, + /** * Attribute type for retrieving the service ticket flags of an - * established Kerberos 5 security context. + * established Kerberos 5 security context. The returned object is + * a boolean array for the service ticket flags, which is long enough + * to contain all true bits. This means if the user wants to get the + * n'th bit but the length of the returned array is less than + * n, it is regarded as false. */ KRB5_GET_TKT_FLAGS, /** @@ -49,7 +74,17 @@ KRB5_GET_AUTHZ_DATA, /** * Attribute type for retrieving the authtime in the service ticket - * of an established Kerberos 5 security context. + * of an established Kerberos 5 security context. The returned object + * is a String object in the standard KerberosTime format defined in + * RFC 4120 Section 5.2.3. */ - KRB5_GET_AUTHTIME + KRB5_GET_AUTHTIME, + /** + * Attribute type for retrieving the KRB_CRED message that an initiator + * is about to send to an acceptor. The return type is an instance of + * {@link javax.security.auth.kerberos.KerberosCredMessage}. + * + * @since 1.9 + */ + KRB5_GET_KRB_CRED, } diff -r d553e7400295 -r 6c9ff31edda0 jdk/src/share/classes/java/lang/Integer.java --- a/jdk/src/share/classes/java/lang/Integer.java Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/src/share/classes/java/lang/Integer.java Wed Jul 05 19:52:15 2017 +0200 @@ -26,6 +26,7 @@ package java.lang; import java.lang.annotation.Native; +import java.util.Objects; /** * The {@code Integer} class wraps a value of the primitive type @@ -319,24 +320,27 @@ } /** - * Format a long (treated as unsigned) into a character buffer. + * Format an {@code int} (treated as unsigned) into a character buffer. If + * {@code len} exceeds the formatted ASCII representation of {@code val}, + * {@code buf} will be padded with leading zeroes. + * * @param val the unsigned int to format * @param shift the log2 of the base to format in (4 for hex, 3 for octal, 1 for binary) * @param buf the character buffer to write to * @param offset the offset in the destination buffer to start at * @param len the number of characters to write - * @return the lowest character location used */ - static int formatUnsignedInt(int val, int shift, char[] buf, int offset, int len) { - int charPos = len; + static void formatUnsignedInt(int val, int shift, char[] buf, int offset, int len) { + // assert shift > 0 && shift <=5 : "Illegal shift value"; + // assert offset >= 0 && offset < buf.length : "illegal offset"; + // assert len > 0 && (offset + len) <= buf.length : "illegal length"; + int charPos = offset + len; int radix = 1 << shift; int mask = radix - 1; do { - buf[offset + --charPos] = Integer.digits[val & mask]; + buf[--charPos] = Integer.digits[val & mask]; val >>>= shift; - } while (val != 0 && charPos > 0); - - return charPos; + } while (charPos > offset); } final static char [] DigitTens = { @@ -549,12 +553,9 @@ " greater than Character.MAX_RADIX"); } - int result = 0; boolean negative = false; int i = 0, len = s.length(); int limit = -Integer.MAX_VALUE; - int multmin; - int digit; if (len > 0) { char firstChar = s.charAt(0); @@ -562,21 +563,21 @@ if (firstChar == '-') { negative = true; limit = Integer.MIN_VALUE; - } else if (firstChar != '+') + } else if (firstChar != '+') { throw NumberFormatException.forInputString(s); + } - if (len == 1) // Cannot have lone "+" or "-" + if (len == 1) { // Cannot have lone "+" or "-" throw NumberFormatException.forInputString(s); + } i++; } - multmin = limit / radix; + int multmin = limit / radix; + int result = 0; while (i < len) { // Accumulating negatively avoids surprises near MAX_VALUE - digit = Character.digit(s.charAt(i++),radix); - if (digit < 0) { - throw NumberFormatException.forInputString(s); - } - if (result < multmin) { + int digit = Character.digit(s.charAt(i++), radix); + if (digit < 0 || result < multmin) { throw NumberFormatException.forInputString(s); } result *= radix; @@ -585,10 +586,126 @@ } result -= digit; } + return negative ? result : -result; } else { throw NumberFormatException.forInputString(s); } - return negative ? result : -result; + } + + /** + * Parses the {@link CharSequence} argument as a signed {@code int} in the + * specified {@code radix}, beginning at the specified {@code beginIndex} + * and extending to the end of the sequence. + * + *

The method does not take steps to guard against the + * {@code CharSequence} being mutated while parsing. + * + * @param s the {@code CharSequence} containing the {@code int} + * representation to be parsed + * @param radix the radix to be used while parsing {@code s}. + * @param beginIndex the beginning index, inclusive. + * @return the signed {@code int} represented by the subsequence in + * the specified radix. + * @throws NullPointerException if {@code s} is null. + * @throws IndexOutOfBoundsException if {@code beginIndex} is + * negative, or if {@code beginIndex} is greater than + * {@code s.length()}. + * @throws NumberFormatException if the {@code CharSequence} does not + * contain a parsable {@code int} in the specified + * {@code radix}, or if {@code radix} is either smaller than + * {@link java.lang.Character#MIN_RADIX} or larger than + * {@link java.lang.Character#MAX_RADIX}. + * @since 1.9 + */ + public static int parseInt(CharSequence s, int radix, int beginIndex) + throws NumberFormatException { + // forces an implicit null check of s + return parseInt(s, radix, beginIndex, s.length()); + } + + /** + * Parses the {@link CharSequence} argument as a signed {@code int} in the + * specified {@code radix}, beginning at the specified {@code beginIndex} + * and extending to {@code endIndex - 1}. + * + *

The method does not take steps to guard against the + * {@code CharSequence} being mutated while parsing. + * + * @param s the {@code CharSequence} containing the {@code int} + * representation to be parsed + * @param radix the radix to be used while parsing {@code s}. + * @param beginIndex the beginning index, inclusive. + * @param endIndex the ending index, exclusive. + * @return the signed {@code int} represented by the subsequence in + * the specified radix. + * @throws NullPointerException if {@code s} is null. + * @throws IndexOutOfBoundsException if {@code beginIndex} is + * negative, or if {@code beginIndex} is greater than + * {@code endIndex} or if {@code endIndex} is greater than + * {@code s.length()}. + * @throws NumberFormatException if the {@code CharSequence} does not + * contain a parsable {@code int} in the specified + * {@code radix}, or if {@code radix} is either smaller than + * {@link java.lang.Character#MIN_RADIX} or larger than + * {@link java.lang.Character#MAX_RADIX}. + * @since 1.9 + */ + public static int parseInt(CharSequence s, int radix, int beginIndex, int endIndex) + throws NumberFormatException { + s = Objects.requireNonNull(s); + + if (beginIndex < 0 || beginIndex > endIndex || endIndex > s.length()) { + throw new IndexOutOfBoundsException(); + } + if (radix < Character.MIN_RADIX) { + throw new NumberFormatException("radix " + radix + + " less than Character.MIN_RADIX"); + } + if (radix > Character.MAX_RADIX) { + throw new NumberFormatException("radix " + radix + + " greater than Character.MAX_RADIX"); + } + + boolean negative = false; + int i = beginIndex; + int limit = -Integer.MAX_VALUE; + + if (i < endIndex) { + char firstChar = s.charAt(i); + if (firstChar < '0') { // Possible leading "+" or "-" + if (firstChar == '-') { + negative = true; + limit = Integer.MIN_VALUE; + } else if (firstChar != '+') { + throw NumberFormatException.forCharSequence(s, beginIndex, + endIndex, i); + } + i++; + if (i == endIndex) { // Cannot have lone "+" or "-" + throw NumberFormatException.forCharSequence(s, beginIndex, + endIndex, i); + } + } + int multmin = limit / radix; + int result = 0; + while (i < endIndex) { + // Accumulating negatively avoids surprises near MAX_VALUE + int digit = Character.digit(s.charAt(i++), radix); + if (digit < 0 || result < multmin) { + throw NumberFormatException.forCharSequence(s, beginIndex, + endIndex, i); + } + result *= radix; + if (result < limit + digit) { + throw NumberFormatException.forCharSequence(s, beginIndex, + endIndex, i); + } + result -= digit; + } + return negative ? result : -result; + } else { + throw NumberFormatException.forInputString(""); + } } /** @@ -689,6 +806,99 @@ } /** + * Parses the {@link CharSequence} argument as an unsigned {@code int} in + * the specified {@code radix}, beginning at the specified + * {@code beginIndex} and extending to the end of the sequence. + * + *

The method does not take steps to guard against the + * {@code CharSequence} being mutated while parsing. + * + * @param s the {@code CharSequence} containing the unsigned + * {@code int} representation to be parsed + * @param radix the radix to be used while parsing {@code s}. + * @param beginIndex the beginning index, inclusive. + * @return the unsigned {@code int} represented by the subsequence in + * the specified radix. + * @throws NullPointerException if {@code s} is null. + * @throws IndexOutOfBoundsException if {@code beginIndex} is + * negative, or if {@code beginIndex} is greater than + * {@code s.length()}. + * @throws NumberFormatException if the {@code CharSequence} does not + * contain a parsable unsigned {@code int} in the specified + * {@code radix}, or if {@code radix} is either smaller than + * {@link java.lang.Character#MIN_RADIX} or larger than + * {@link java.lang.Character#MAX_RADIX}. + * @since 1.9 + */ + public static int parseUnsignedInt(CharSequence s, int radix, int beginIndex) + throws NumberFormatException { + // forces an implicit null check of s + return parseUnsignedInt(s, radix, beginIndex, s.length()); + } + + /** + * Parses the {@link CharSequence} argument as an unsigned {@code int} in + * the specified {@code radix}, beginning at the specified + * {@code beginIndex} and extending to {@code endIndex - 1}. + * + *

The method does not take steps to guard against the + * {@code CharSequence} being mutated while parsing. + * + * @param s the {@code CharSequence} containing the unsigned + * {@code int} representation to be parsed + * @param radix the radix to be used while parsing {@code s}. + * @param beginIndex the beginning index, inclusive. + * @param endIndex the ending index, exclusive. + * @return the unsigned {@code int} represented by the subsequence in + * the specified radix. + * @throws NullPointerException if {@code s} is null. + * @throws IndexOutOfBoundsException if {@code beginIndex} is + * negative, or if {@code beginIndex} is greater than + * {@code endIndex} or if {@code endIndex} is greater than + * {@code s.length()}. + * @throws NumberFormatException if the {@code CharSequence} does not + * contain a parsable unsigned {@code int} in the specified + * {@code radix}, or if {@code radix} is either smaller than + * {@link java.lang.Character#MIN_RADIX} or larger than + * {@link java.lang.Character#MAX_RADIX}. + * @since 1.9 + */ + public static int parseUnsignedInt(CharSequence s, int radix, int beginIndex, int endIndex) + throws NumberFormatException { + s = Objects.requireNonNull(s); + + if (beginIndex < 0 || beginIndex > endIndex || endIndex > s.length()) { + throw new IndexOutOfBoundsException(); + } + int start = beginIndex, len = endIndex - beginIndex; + + if (len > 0) { + char firstChar = s.charAt(start); + if (firstChar == '-') { + throw new + NumberFormatException(String.format("Illegal leading minus sign " + + "on unsigned string %s.", s)); + } else { + if (len <= 5 || // Integer.MAX_VALUE in Character.MAX_RADIX is 6 digits + (radix == 10 && len <= 9)) { // Integer.MAX_VALUE in base 10 is 10 digits + return parseInt(s, radix, start, start + len); + } else { + long ell = Long.parseLong(s, radix, start, start + len); + if ((ell & 0xffff_ffff_0000_0000L) == 0) { + return (int) ell; + } else { + throw new + NumberFormatException(String.format("String value %s exceeds " + + "range of unsigned int.", s)); + } + } + } + } else { + throw new NumberFormatException(""); + } + } + + /** * Parses the string argument as an unsigned decimal integer. The * characters in the string must all be decimal digits, except * that the first character may be an an ASCII plus sign {@code diff -r d553e7400295 -r 6c9ff31edda0 jdk/src/share/classes/java/lang/Long.java --- a/jdk/src/share/classes/java/lang/Long.java Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/src/share/classes/java/lang/Long.java Wed Jul 05 19:52:15 2017 +0200 @@ -27,6 +27,7 @@ import java.lang.annotation.Native; import java.math.*; +import java.util.Objects; /** @@ -360,24 +361,27 @@ } /** - * Format a long (treated as unsigned) into a character buffer. + * Format a long (treated as unsigned) into a character buffer. If + * {@code len} exceeds the formatted ASCII representation of {@code val}, + * {@code buf} will be padded with leading zeroes. + * * @param val the unsigned long to format * @param shift the log2 of the base to format in (4 for hex, 3 for octal, 1 for binary) * @param buf the character buffer to write to * @param offset the offset in the destination buffer to start at * @param len the number of characters to write - * @return the lowest character location used */ - static int formatUnsignedLong(long val, int shift, char[] buf, int offset, int len) { - int charPos = len; + static void formatUnsignedLong(long val, int shift, char[] buf, int offset, int len) { + // assert shift > 0 && shift <=5 : "Illegal shift value"; + // assert offset >= 0 && offset < buf.length : "illegal offset"; + // assert len > 0 && (offset + len) <= buf.length : "illegal length"; + int charPos = offset + len; int radix = 1 << shift; int mask = radix - 1; do { - buf[offset + --charPos] = Integer.digits[((int) val) & mask]; + buf[--charPos] = Integer.digits[((int) val) & mask]; val >>>= shift; - } while (val != 0 && charPos > 0); - - return charPos; + } while (charPos > offset); } /** @@ -561,12 +565,9 @@ " greater than Character.MAX_RADIX"); } - long result = 0; boolean negative = false; int i = 0, len = s.length(); long limit = -Long.MAX_VALUE; - long multmin; - int digit; if (len > 0) { char firstChar = s.charAt(0); @@ -574,21 +575,21 @@ if (firstChar == '-') { negative = true; limit = Long.MIN_VALUE; - } else if (firstChar != '+') + } else if (firstChar != '+') { throw NumberFormatException.forInputString(s); + } - if (len == 1) // Cannot have lone "+" or "-" + if (len == 1) { // Cannot have lone "+" or "-" throw NumberFormatException.forInputString(s); + } i++; } - multmin = limit / radix; + long multmin = limit / radix; + long result = 0; while (i < len) { // Accumulating negatively avoids surprises near MAX_VALUE - digit = Character.digit(s.charAt(i++),radix); - if (digit < 0) { - throw NumberFormatException.forInputString(s); - } - if (result < multmin) { + int digit = Character.digit(s.charAt(i++),radix); + if (digit < 0 || result < multmin) { throw NumberFormatException.forInputString(s); } result *= radix; @@ -597,10 +598,126 @@ } result -= digit; } + return negative ? result : -result; } else { throw NumberFormatException.forInputString(s); } - return negative ? result : -result; + } + + /** + * Parses the {@link CharSequence} argument as a signed {@code long} in + * the specified {@code radix}, beginning at the specified {@code beginIndex} + * and extending to the end of the sequence. + * + *

The method does not take steps to guard against the + * {@code CharSequence} being mutated while parsing. + * + * @param s the {@code CharSequence} containing the {@code long} + * representation to be parsed + * @param radix the radix to be used while parsing {@code s}. + * @param beginIndex the beginning index, inclusive. + * @return the signed {@code long} represented by the subsequence in + * the specified radix. + * @throws NullPointerException if {@code s} is null. + * @throws IndexOutOfBoundsException if {@code beginIndex} is + * negative, or if {@code beginIndex} is greater than + * {@code s.length()}. + * @throws NumberFormatException if the {@code CharSequence} does not + * contain a parsable {@code long} in the specified + * {@code radix}, or if {@code radix} is either smaller than + * {@link java.lang.Character#MIN_RADIX} or larger than + * {@link java.lang.Character#MAX_RADIX}. + * @since 1.9 + */ + public static long parseLong(CharSequence s, int radix, int beginIndex) + throws NumberFormatException { + // forces a null check of s + return parseLong(s, radix, beginIndex, s.length()); + } + + /** + * Parses the {@link CharSequence} argument as a signed {@code long} in + * the specified {@code radix}, beginning at the specified + * {@code beginIndex} and extending to {@code endIndex - 1}. + * + *

The method does not take steps to guard against the + * {@code CharSequence} being mutated while parsing. + * + * @param s the {@code CharSequence} containing the {@code long} + * representation to be parsed + * @param radix the radix to be used while parsing {@code s}. + * @param beginIndex the beginning index, inclusive. + * @param endIndex the ending index, exclusive. + * @return the signed {@code long} represented by the subsequence in + * the specified radix. + * @throws NullPointerException if {@code s} is null. + * @throws IndexOutOfBoundsException if {@code beginIndex} is + * negative, or if {@code beginIndex} is greater than + * {@code endIndex} or if {@code endIndex} is greater than + * {@code s.length()}. + * @throws NumberFormatException if the {@code CharSequence} does not + * contain a parsable {@code int} in the specified + * {@code radix}, or if {@code radix} is either smaller than + * {@link java.lang.Character#MIN_RADIX} or larger than + * {@link java.lang.Character#MAX_RADIX}. + * @since 1.9 + */ + public static long parseLong(CharSequence s, int radix, int beginIndex, int endIndex) + throws NumberFormatException { + s = Objects.requireNonNull(s); + + if (beginIndex < 0 || beginIndex > endIndex || endIndex > s.length()) { + throw new IndexOutOfBoundsException(); + } + if (radix < Character.MIN_RADIX) { + throw new NumberFormatException("radix " + radix + + " less than Character.MIN_RADIX"); + } + if (radix > Character.MAX_RADIX) { + throw new NumberFormatException("radix " + radix + + " greater than Character.MAX_RADIX"); + } + + boolean negative = false; + int i = beginIndex; + long limit = -Long.MAX_VALUE; + + if (i < endIndex) { + char firstChar = s.charAt(i); + if (firstChar < '0') { // Possible leading "+" or "-" + if (firstChar == '-') { + negative = true; + limit = Long.MIN_VALUE; + } else if (firstChar != '+') { + throw NumberFormatException.forCharSequence(s, beginIndex, + endIndex, i); + } + i++; + } + if (i >= endIndex) { // Cannot have lone "+", "-" or "" + throw NumberFormatException.forCharSequence(s, beginIndex, + endIndex, i); + } + long multmin = limit / radix; + long result = 0; + while (i < endIndex) { + // Accumulating negatively avoids surprises near MAX_VALUE + int digit = Character.digit(s.charAt(i++), radix); + if (digit < 0 || result < multmin) { + throw NumberFormatException.forCharSequence(s, beginIndex, + endIndex, i); + } + result *= radix; + if (result < limit + digit) { + throw NumberFormatException.forCharSequence(s, beginIndex, + endIndex, i); + } + result -= digit; + } + return negative ? result : -result; + } else { + throw new NumberFormatException(""); + } } /** @@ -694,7 +811,7 @@ } // No need for range checks on len due to testing above. - long first = parseLong(s.substring(0, len - 1), radix); + long first = parseLong(s, radix, 0, len - 1); int second = Character.digit(s.charAt(len - 1), radix); if (second < 0) { throw new NumberFormatException("Bad digit at end of " + s); @@ -764,6 +881,155 @@ } /** + * Parses the {@link CharSequence} argument as an unsigned {@code long} in + * the specified {@code radix}, beginning at the specified + * {@code beginIndex} and extending to the end of the sequence. + * + *

The method does not take steps to guard against the + * {@code CharSequence} being mutated while parsing. + * + * @param s the {@code CharSequence} containing the unsigned + * {@code long} representation to be parsed + * @param radix the radix to be used while parsing {@code s}. + * @param beginIndex the beginning index, inclusive. + * @return the unsigned {@code long} represented by the subsequence in + * the specified radix. + * @throws NullPointerException if {@code s} is null. + * @throws IndexOutOfBoundsException if {@code beginIndex} is + * negative, or if {@code beginIndex} is greater than + * {@code s.length()}. + * @throws NumberFormatException if the {@code CharSequence} does not + * contain a parsable unsigned {@code long} in the specified + * {@code radix}, or if {@code radix} is either smaller than + * {@link java.lang.Character#MIN_RADIX} or larger than + * {@link java.lang.Character#MAX_RADIX}. + * @since 1.9 + */ + public static long parseUnsignedLong(CharSequence s, int radix, int beginIndex) + throws NumberFormatException { + // forces a null check of s + return parseUnsignedLong(s, radix, beginIndex, s.length()); + } + + /** + * Parses the {@link CharSequence} argument as an unsigned {@code long} in + * the specified {@code radix}, beginning at the specified + * {@code beginIndex} and extending to {@code endIndex - 1}. + * + *

The method does not take steps to guard against the + * {@code CharSequence} being mutated while parsing. + * + * @param s the {@code CharSequence} containing the unsigned + * {@code long} representation to be parsed + * @param radix the radix to be used while parsing {@code s}. + * @param beginIndex the beginning index, inclusive. + * @param endIndex the ending index, exclusive. + * @return the unsigned {@code long} represented by the subsequence in + * the specified radix. + * @throws NullPointerException if {@code s} is null. + * @throws IndexOutOfBoundsException if {@code beginIndex} is + * negative, or if {@code beginIndex} is greater than + * {@code endIndex} or if {@code endIndex} is greater than + * {@code s.length()}. + * @throws NumberFormatException if the {@code CharSequence} does not + * contain a parsable unsigned {@code long} in the specified + * {@code radix}, or if {@code radix} is either smaller than + * {@link java.lang.Character#MIN_RADIX} or larger than + * {@link java.lang.Character#MAX_RADIX}. + * @since 1.9 + */ + public static long parseUnsignedLong(CharSequence s, int radix, int beginIndex, int endIndex) + throws NumberFormatException { + s = Objects.requireNonNull(s); + + if (beginIndex < 0 || beginIndex > endIndex || endIndex > s.length()) { + throw new IndexOutOfBoundsException(); + } + int start = beginIndex, len = endIndex - beginIndex; + + if (len > 0) { + char firstChar = s.charAt(start); + if (firstChar == '-') { + throw new NumberFormatException(String.format("Illegal leading minus sign " + + "on unsigned string %s.", s.subSequence(start, start + len))); + } else { + if (len <= 12 || // Long.MAX_VALUE in Character.MAX_RADIX is 13 digits + (radix == 10 && len <= 18) ) { // Long.MAX_VALUE in base 10 is 19 digits + return parseLong(s, radix, start, start + len); + } + + // No need for range checks on end due to testing above. + long first = parseLong(s, radix, start, start + len - 1); + int second = Character.digit(s.charAt(start + len - 1), radix); + if (second < 0) { + throw new NumberFormatException("Bad digit at end of " + + s.subSequence(start, start + len)); + } + long result = first * radix + second; + + /* + * Test leftmost bits of multiprecision extension of first*radix + * for overflow. The number of bits needed is defined by + * GUARD_BIT = ceil(log2(Character.MAX_RADIX)) + 1 = 7. Then + * int guard = radix*(int)(first >>> (64 - GUARD_BIT)) and + * overflow is tested by splitting guard in the ranges + * guard < 92, 92 <= guard < 128, and 128 <= guard, where + * 92 = 128 - Character.MAX_RADIX. Note that guard cannot take + * on a value which does not include a prime factor in the legal + * radix range. + */ + int guard = radix * (int) (first >>> 57); + if (guard >= 128 || + (result >= 0 && guard >= 128 - Character.MAX_RADIX)) { + /* + * For purposes of exposition, the programmatic statements + * below should be taken to be multi-precision, i.e., not + * subject to overflow. + * + * A) Condition guard >= 128: + * If guard >= 128 then first*radix >= 2^7 * 2^57 = 2^64 + * hence always overflow. + * + * B) Condition guard < 92: + * Define left7 = first >>> 57. + * Given first = (left7 * 2^57) + (first & (2^57 - 1)) then + * result <= (radix*left7)*2^57 + radix*(2^57 - 1) + second. + * Thus if radix*left7 < 92, radix <= 36, and second < 36, + * then result < 92*2^57 + 36*(2^57 - 1) + 36 = 2^64 hence + * never overflow. + * + * C) Condition 92 <= guard < 128: + * first*radix + second >= radix*left7*2^57 + second + * so that first*radix + second >= 92*2^57 + 0 > 2^63 + * + * D) Condition guard < 128: + * radix*first <= (radix*left7) * 2^57 + radix*(2^57 - 1) + * so + * radix*first + second <= (radix*left7) * 2^57 + radix*(2^57 - 1) + 36 + * thus + * radix*first + second < 128 * 2^57 + 36*2^57 - radix + 36 + * whence + * radix*first + second < 2^64 + 2^6*2^57 = 2^64 + 2^63 + * + * E) Conditions C, D, and result >= 0: + * C and D combined imply the mathematical result + * 2^63 < first*radix + second < 2^64 + 2^63. The lower + * bound is therefore negative as a signed long, but the + * upper bound is too small to overflow again after the + * signed long overflows to positive above 2^64 - 1. Hence + * result >= 0 implies overflow given C and D. + */ + throw new NumberFormatException(String.format("String value %s exceeds " + + "range of unsigned long.", s.subSequence(start, start + len))); + } + return result; + } + } else { + throw NumberFormatException.forInputString(""); + } + } + + /** * Parses the string argument as an unsigned decimal {@code long}. The * characters in the string must all be decimal digits, except * that the first character may be an an ASCII plus sign {@code diff -r d553e7400295 -r 6c9ff31edda0 jdk/src/share/classes/java/lang/NumberFormatException.java --- a/jdk/src/share/classes/java/lang/NumberFormatException.java Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/src/share/classes/java/lang/NumberFormatException.java Wed Jul 05 19:52:15 2017 +0200 @@ -56,7 +56,7 @@ } /** - * Factory method for making a NumberFormatException + * Factory method for making a {@code NumberFormatException} * given the specified input which caused the error. * * @param s the input causing the error @@ -64,4 +64,20 @@ static NumberFormatException forInputString(String s) { return new NumberFormatException("For input string: \"" + s + "\""); } + + /** + * Factory method for making a {@code NumberFormatException} + * given the specified input which caused the error. + * + * @param s the input causing the error + * @param beginIndex the beginning index, inclusive. + * @param endIndex the ending index, exclusive. + * @param errorIndex the index of the first error in s + */ + static NumberFormatException forCharSequence(CharSequence s, + int beginIndex, int endIndex, int errorIndex) { + return new NumberFormatException("Error at index " + + (errorIndex - beginIndex) + " in: \"" + + s.subSequence(beginIndex, endIndex) + "\""); + } } diff -r d553e7400295 -r 6c9ff31edda0 jdk/src/share/classes/java/lang/String.java --- a/jdk/src/share/classes/java/lang/String.java Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/src/share/classes/java/lang/String.java Wed Jul 05 19:52:15 2017 +0200 @@ -2580,7 +2580,8 @@ } for (int i = first; i < len; i++) { int cp = (int)value[i]; - if (cp == '\u03A3') { // GREEK CAPITAL LETTER SIGMA + if (cp == '\u03A3' || // GREEK CAPITAL LETTER SIGMA + Character.isSurrogate((char)cp)) { return toLowerCaseEx(result, i, locale, false); } if (cp == '\u0130') { // LATIN CAPITAL LETTER I WITH DOT ABOVE @@ -2742,7 +2743,11 @@ return toUpperCaseEx(result, first, locale, false); } for (int i = first; i < len; i++) { - int cp = Character.toUpperCaseEx((int)value[i]); + int cp = (int)value[i]; + if (Character.isSurrogate((char)cp)) { + return toUpperCaseEx(result, i, locale, false); + } + cp = Character.toUpperCaseEx(cp); if (!Character.isBmpCodePoint(cp)) { // Character.ERROR is not bmp return toUpperCaseEx(result, i, locale, false); } diff -r d553e7400295 -r 6c9ff31edda0 jdk/src/share/classes/java/lang/System.java --- a/jdk/src/share/classes/java/lang/System.java Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/src/share/classes/java/lang/System.java Wed Jul 05 19:52:15 2017 +0200 @@ -1263,6 +1263,12 @@ public void invokeFinalize(Object o) throws Throwable { o.finalize(); } + public void formatUnsignedLong(long val, int shift, char[] buf, int offset, int len) { + Long.formatUnsignedLong(val, shift, buf, offset, len); + } + public void formatUnsignedInt(int val, int shift, char[] buf, int offset, int len) { + Integer.formatUnsignedInt(val, shift, buf, offset, len); + } }); } } diff -r d553e7400295 -r 6c9ff31edda0 jdk/src/share/classes/java/nio/StringCharBuffer.java --- a/jdk/src/share/classes/java/nio/StringCharBuffer.java Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/src/share/classes/java/nio/StringCharBuffer.java Wed Jul 05 19:52:15 2017 +0200 @@ -100,7 +100,7 @@ } final String toString(int start, int end) { - return str.toString().substring(start + offset, end + offset); + return str.subSequence(start + offset, end + offset).toString(); } public final CharBuffer subSequence(int start, int end) { diff -r d553e7400295 -r 6c9ff31edda0 jdk/src/share/classes/java/util/UUID.java --- a/jdk/src/share/classes/java/util/UUID.java Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/src/share/classes/java/util/UUID.java Wed Jul 05 19:52:15 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,6 +27,9 @@ import java.security.*; +import sun.misc.JavaLangAccess; +import sun.misc.SharedSecrets; + /** * A class that represents an immutable universally unique identifier (UUID). * A UUID represents a 128-bit value. @@ -88,6 +91,8 @@ */ private final long leastSigBits; + private static final JavaLangAccess jla = SharedSecrets.getJavaLangAccess(); + /* * The random number generator used by this class to create random * based UUIDs. In a holder class to defer initialization until needed. @@ -189,21 +194,35 @@ * */ public static UUID fromString(String name) { - String[] components = name.split("-"); - if (components.length != 5) - throw new IllegalArgumentException("Invalid UUID string: "+name); - for (int i=0; i<5; i++) - components[i] = "0x"+components[i]; + if (name.length() > 36) { + throw new IllegalArgumentException("UUID string too large"); + } + + int dash1 = name.indexOf('-', 0); + int dash2 = name.indexOf('-', dash1 + 1); + int dash3 = name.indexOf('-', dash2 + 1); + int dash4 = name.indexOf('-', dash3 + 1); + int dash5 = name.indexOf('-', dash4 + 1); - long mostSigBits = Long.decode(components[0]).longValue(); + // For any valid input, dash1 through dash4 will be positive and dash5 + // negative, but it's enough to check dash4 and dash5: + // - if dash1 is -1, dash4 will be -1 + // - if dash1 is positive but dash2 is -1, dash4 will be -1 + // - if dash1 and dash2 is positive, dash3 will be -1, dash4 will be + // positive, but so will dash5 + if (dash4 < 0 || dash5 >= 0) { + throw new IllegalArgumentException("Invalid UUID string: " + name); + } + + long mostSigBits = Long.parseLong(name, 16, 0, dash1) & 0xffffffffL; mostSigBits <<= 16; - mostSigBits |= Long.decode(components[1]).longValue(); + mostSigBits |= Long.parseLong(name, 16, dash1 + 1, dash2) & 0xffffL; mostSigBits <<= 16; - mostSigBits |= Long.decode(components[2]).longValue(); + mostSigBits |= Long.parseLong(name, 16, dash2 + 1, dash3) & 0xffffL; - long leastSigBits = Long.decode(components[3]).longValue(); + long leastSigBits = Long.parseLong(name, 16, dash3 + 1, dash4) & 0xffffL; leastSigBits <<= 48; - leastSigBits |= Long.decode(components[4]).longValue(); + leastSigBits |= Long.parseLong(name, 16, dash4 + 1) & 0xffffffffffffL; return new UUID(mostSigBits, leastSigBits); } @@ -373,17 +392,17 @@ * @return A string representation of this {@code UUID} */ public String toString() { - return (digits(mostSigBits >> 32, 8) + "-" + - digits(mostSigBits >> 16, 4) + "-" + - digits(mostSigBits, 4) + "-" + - digits(leastSigBits >> 48, 4) + "-" + - digits(leastSigBits, 12)); - } - - /** Returns val represented by the specified number of hex digits. */ - private static String digits(long val, int digits) { - long hi = 1L << (digits * 4); - return Long.toHexString(hi | (val & (hi - 1))).substring(1); + char[] chars = new char[36]; + jla.formatUnsignedLong(mostSigBits >> 32, 4, chars, 0, 8); + chars[8] = '-'; + jla.formatUnsignedLong(mostSigBits >> 16, 4, chars, 9, 4); + chars[13] = '-'; + jla.formatUnsignedLong(mostSigBits, 4, chars, 14, 4); + chars[18] = '-'; + jla.formatUnsignedLong(leastSigBits >> 48, 4, chars, 19, 4); + chars[23] = '-'; + jla.formatUnsignedLong(leastSigBits, 4, chars, 24, 12); + return jla.newStringUnsafe(chars); } /** diff -r d553e7400295 -r 6c9ff31edda0 jdk/src/share/classes/java/util/package.html --- a/jdk/src/share/classes/java/util/package.html Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/src/share/classes/java/util/package.html Wed Jul 05 19:52:15 2017 +0200 @@ -43,7 +43,7 @@

Related Documentation

For overviews, tutorials, examples, guides, and tool documentation, please see:
    -
  • +
  • Collections Framework Tutorial
  • Collections diff -r d553e7400295 -r 6c9ff31edda0 jdk/src/share/classes/javax/security/auth/kerberos/EncryptionKey.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/javax/security/auth/kerberos/EncryptionKey.java Wed Jul 05 19:52:15 2017 +0200 @@ -0,0 +1,208 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package javax.security.auth.kerberos; + +import java.util.Arrays; +import java.util.Objects; +import javax.crypto.SecretKey; +import javax.security.auth.DestroyFailedException; + +/** + * This class encapsulates an EncryptionKey used in Kerberos.

    + * + * An EncryptionKey is defined in Section 4.2.9 of the Kerberos Protocol + * Specification (RFC 4120) as: + *

    + *     EncryptionKey   ::= SEQUENCE {
    + *             keytype         [0] Int32 -- actually encryption type --,
    + *             keyvalue        [1] OCTET STRING
    + *     }
    + * 
    + * The key material of an {@code EncryptionKey} is defined as the value + * of the {@code keyValue} above.

    + * + * @since 1.9 + */ +public final class EncryptionKey implements SecretKey { + + private static final long serialVersionUID = 9L; + + /** + * {@code KeyImpl} is serialized by writing out the ASN.1 encoded bytes + * of the encryption key. + * + * @serial + */ + final private KeyImpl key; + + private transient boolean destroyed = false; + + /** + * Constructs a {@code EncryptionKey} from the given bytes and + * the key type. + *

    + * The contents of the byte array are copied; subsequent modification of + * the byte array does not affect the newly created key. + * + * @param keyBytes the key material for the key + * @param keyType the key type for the key as defined by the + * Kerberos protocol specification. + * @throws NullPointerException if keyBytes is null + */ + public EncryptionKey(byte[] keyBytes, int keyType) { + key = new KeyImpl(Objects.requireNonNull(keyBytes), keyType); + } + + /** + * Returns the key type for this key. + * + * @return the key type. + * @throws IllegalStateException if the key is destroyed + */ + public int getKeyType() { + // KeyImpl already checked if destroyed + return key.getKeyType(); + } + + /* + * Methods from java.security.Key + */ + + /** + * Returns the standard algorithm name for this key. The algorithm names + * are the encryption type string defined on the IANA + * Kerberos Encryption Type Numbers + * page. + *

    + * This method can return the following value not defined on the IANA page: + *

      + *
    1. none: for etype equal to 0
    2. + *
    3. unknown: for etype greater than 0 but unsupported by + * the implementation
    4. + *
    5. private: for etype smaller than 0
    6. + *
    + * + * @return the name of the algorithm associated with this key. + * @throws IllegalStateException if the key is destroyed + */ + @Override + public String getAlgorithm() { + // KeyImpl already checked if destroyed + return key.getAlgorithm(); + } + + /** + * Returns the name of the encoding format for this key. + * + * @return the String "RAW" + * @throws IllegalStateException if the key is destroyed + */ + @Override + public String getFormat() { + // KeyImpl already checked if destroyed + return key.getFormat(); + } + + /** + * Returns the key material of this key. + * + * @return a newly allocated byte array that contains the key material + * @throws IllegalStateException if the key is destroyed + */ + @Override + public byte[] getEncoded() { + // KeyImpl already checked if destroyed + return key.getEncoded(); + } + + /** + * Destroys this key by clearing out the key material of this key. + * + * @throws DestroyFailedException if some error occurs while destorying + * this key. + */ + @Override + public void destroy() throws DestroyFailedException { + if (!destroyed) { + key.destroy(); + destroyed = true; + } + } + + + @Override + public boolean isDestroyed() { + return destroyed; + } + + @Override + public String toString() { + if (destroyed) { + return "Destroyed EncryptionKey"; + } + return "key " + key.toString(); + } + + @Override + public int hashCode() { + int result = 17; + if (isDestroyed()) { + return result; + } + result = 37 * result + Arrays.hashCode(getEncoded()); + return 37 * result + getKeyType(); + } + + /** + * Compares the specified Object with this key for equality. + * Returns true if the given object is also a + * {@code EncryptionKey} and the two + * {@code EncryptionKey} instances are equivalent. + * + * @param other the Object to compare to + * @return true if the specified object is equal to this EncryptionKey, + * false otherwise. NOTE: Returns false if either of the EncryptionKey + * objects has been destroyed. + */ + @Override + public boolean equals(Object other) { + + if (other == this) + return true; + + if (! (other instanceof EncryptionKey)) { + return false; + } + + EncryptionKey otherKey = ((EncryptionKey) other); + if (isDestroyed() || otherKey.isDestroyed()) { + return false; + } + + return getKeyType() == otherKey.getKeyType() + && Arrays.equals(getEncoded(), otherKey.getEncoded()); + } +} diff -r d553e7400295 -r 6c9ff31edda0 jdk/src/share/classes/javax/security/auth/kerberos/KerberosCredMessage.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/javax/security/auth/kerberos/KerberosCredMessage.java Wed Jul 05 19:52:15 2017 +0200 @@ -0,0 +1,171 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package javax.security.auth.kerberos; + +import javax.security.auth.Destroyable; +import java.util.Arrays; +import java.util.Base64; +import java.util.Objects; + +/** + * This class encapsulates a Kerberos 5 KRB_CRED message which can be used to + * send Kerberos credentials from one principal to another.

    + * + * A KRB_CRED message is defined in Section 5.8.1 of the Kerberos Protocol + * Specification (RFC 4120) as: + *

    + *    KRB-CRED        ::= [APPLICATION 22] SEQUENCE {
    + *            pvno            [0] INTEGER (5),
    + *            msg-type        [1] INTEGER (22),
    + *            tickets         [2] SEQUENCE OF Ticket,
    + *            enc-part        [3] EncryptedData -- EncKrbCredPart
    + *    }
    + * 

    + * + * @since 1.9 + */ +public final class KerberosCredMessage implements Destroyable { + + final private KerberosPrincipal sender; + final private KerberosPrincipal recipient; + final private byte[] message; + + private boolean destroyed = false; + + /** + * Constructs a {@code KerberosCredMessage} object. + *

    + * The contents of the {@code message} argument are copied; subsequent + * modification of the byte array does not affect the newly created object. + * + * @param sender the sender of the message + * @param recipient the recipient of the message + * @param message the DER encoded KRB_CRED message + * @throws NullPointerException if any of sender, recipient + * or message is null + */ + public KerberosCredMessage(KerberosPrincipal sender, + KerberosPrincipal recipient, + byte[] message) { + this.sender = Objects.requireNonNull(sender); + this.recipient = Objects.requireNonNull(recipient); + this.message = Objects.requireNonNull(message).clone(); + } + + /** + * Returns the DER encoded form of the KRB_CRED message. + * + * @return a newly allocated byte array that contains the encoded form + * @throws IllegalStateException if the object is destroyed + */ + public byte[] getEncoded() { + if (destroyed) { + throw new IllegalStateException("This object is no longer valid"); + } + return message.clone(); + } + + /** + * Returns the sender of this message. + * + * @return the sender + * @throws IllegalStateException if the object is destroyed + */ + public KerberosPrincipal getSender() { + if (destroyed) { + throw new IllegalStateException("This object is no longer valid"); + } + return sender; + } + + /** + * Returns the recipient of this message. + * + * @return the recipient + * @throws IllegalStateException if the object is destroyed + */ + public KerberosPrincipal getRecipient() { + if (destroyed) { + throw new IllegalStateException("This object is no longer valid"); + } + return recipient; + } + + /** + * Destroys this object by clearing out the message. + */ + @Override + public void destroy() { + if (!destroyed) { + Arrays.fill(message, (byte)0); + destroyed = true; + } + } + + @Override + public boolean isDestroyed() { + return destroyed; + } + + @Override + public String toString() { + if (destroyed) { + return "Destroyed KerberosCredMessage"; + } else { + return "KRB_CRED from " + sender + " to " + recipient + ":\n" + + Base64.getUrlEncoder().encodeToString(message); + } + } + + @Override + public int hashCode() { + if (isDestroyed()) { + return -1; + } else { + return Objects.hash(sender, recipient, Arrays.hashCode(message)); + } + } + + @Override + public boolean equals(Object other) { + if (other == this) { + return true; + } + + if (! (other instanceof KerberosCredMessage)) { + return false; + } + + KerberosCredMessage otherMessage = ((KerberosCredMessage) other); + if (isDestroyed() || otherMessage.isDestroyed()) { + return false; + } + + return Objects.equals(sender, otherMessage.sender) + && Objects.equals(recipient, otherMessage.recipient) + && Arrays.equals(message, otherMessage.message); + } +} diff -r d553e7400295 -r 6c9ff31edda0 jdk/src/share/classes/javax/security/auth/kerberos/KerberosKey.java --- a/jdk/src/share/classes/javax/security/auth/kerberos/KerberosKey.java Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/src/share/classes/javax/security/auth/kerberos/KerberosKey.java Wed Jul 05 19:52:15 2017 +0200 @@ -27,13 +27,27 @@ import java.util.Arrays; import javax.crypto.SecretKey; -import javax.security.auth.Destroyable; import javax.security.auth.DestroyFailedException; /** * This class encapsulates a long term secret key for a Kerberos * principal.

    * + * A {@code KerberosKey} object includes an EncryptionKey, a + * {@link KerberosPrincipal} as its owner, and the version number + * of the key.

    + * + * An EncryptionKey is defined in Section 4.2.9 of the Kerberos Protocol + * Specification (RFC 4120) as: + *

    + *     EncryptionKey   ::= SEQUENCE {
    + *             keytype         [0] Int32 -- actually encryption type --,
    + *             keyvalue        [1] OCTET STRING
    + *     }
    + * 
    + * The key material of a {@code KerberosKey} is defined as the value + * of the {@code keyValue} above.

    + * * All Kerberos JAAS login modules that obtain a principal's password and * generate the secret key from it should use this class. * Sometimes, such as when authenticating a server in @@ -70,7 +84,7 @@ * @author Mayank Upadhyay * @since 1.4 */ -public class KerberosKey implements SecretKey, Destroyable { +public class KerberosKey implements SecretKey { private static final long serialVersionUID = -4625402278148246993L; @@ -89,15 +103,8 @@ private final int versionNum; /** - * {@code KeyImpl} is serialized by writing out the ASN1 Encoded bytes + * {@code KeyImpl} is serialized by writing out the ASN.1 encoded bytes * of the encryption key. - * The ASN1 encoding is defined in RFC4120 and as follows: - *

    -    * EncryptionKey   ::= SEQUENCE {
    -    *           keytype   [0] Int32 -- actually encryption type --,
    -    *           keyvalue  [1] OCTET STRING
    -    * }
    -    * 
    * * @serial */ @@ -111,7 +118,7 @@ * key information from a Kerberos "keytab". * * @param principal the principal that this secret key belongs to - * @param keyBytes the raw bytes for the secret key + * @param keyBytes the key material for the secret key * @param keyType the key type for the secret key as defined by the * Kerberos protocol specification. * @param versionNum the version number of this secret key @@ -153,10 +160,12 @@ * Returns the principal that this key belongs to. * * @return the principal this key belongs to. + * @throws IllegalStateException if the key is destroyed */ public final KerberosPrincipal getPrincipal() { - if (destroyed) + if (destroyed) { throw new IllegalStateException("This key is no longer valid"); + } return principal; } @@ -164,10 +173,12 @@ * Returns the key version number. * * @return the key version number. + * @throws IllegalStateException if the key is destroyed */ public final int getVersionNumber() { - if (destroyed) + if (destroyed) { throw new IllegalStateException("This key is no longer valid"); + } return versionNum; } @@ -175,10 +186,10 @@ * Returns the key type for this long-term key. * * @return the key type. + * @throws IllegalStateException if the key is destroyed */ public final int getKeyType() { - if (destroyed) - throw new IllegalStateException("This key is no longer valid"); + // KeyImpl already checked if destroyed return key.getKeyType(); } @@ -201,10 +212,10 @@ * * * @return the name of the algorithm associated with this key. + * @throws IllegalStateException if the key is destroyed */ public final String getAlgorithm() { - if (destroyed) - throw new IllegalStateException("This key is no longer valid"); + // KeyImpl already checked if destroyed return key.getAlgorithm(); } @@ -212,10 +223,10 @@ * Returns the name of the encoding format for this secret key. * * @return the String "RAW" + * @throws IllegalStateException if the key is destroyed */ public final String getFormat() { - if (destroyed) - throw new IllegalStateException("This key is no longer valid"); + // KeyImpl already checked if destroyed return key.getFormat(); } @@ -223,16 +234,15 @@ * Returns the key material of this secret key. * * @return the key material + * @throws IllegalStateException if the key is destroyed */ public final byte[] getEncoded() { - if (destroyed) - throw new IllegalStateException("This key is no longer valid"); + // KeyImpl already checked if destroyed return key.getEncoded(); } /** - * Destroys this key. A call to any of its other methods after this - * will cause an IllegalStateException to be thrown. + * Destroys this key by clearing out the key material of this secret key. * * @throws DestroyFailedException if some error occurs while destorying * this key. @@ -253,9 +263,9 @@ public String toString() { if (destroyed) { - return "Destroyed Principal"; + return "Destroyed KerberosKey"; } - return "Kerberos Principal " + principal.toString() + + return "Kerberos Principal " + principal + "Key Version " + versionNum + "key " + key.toString(); } @@ -293,8 +303,9 @@ */ public boolean equals(Object other) { - if (other == this) + if (other == this) { return true; + } if (! (other instanceof KerberosKey)) { return false; diff -r d553e7400295 -r 6c9ff31edda0 jdk/src/share/classes/javax/security/auth/kerberos/KerberosTicket.java --- a/jdk/src/share/classes/javax/security/auth/kerberos/KerberosTicket.java Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/src/share/classes/javax/security/auth/kerberos/KerberosTicket.java Wed Jul 05 19:52:15 2017 +0200 @@ -35,9 +35,6 @@ import javax.security.auth.RefreshFailedException; import javax.security.auth.DestroyFailedException; import sun.misc.HexDumpEncoder; -import sun.security.krb5.EncryptionKey; -import sun.security.krb5.Asn1Exception; -import sun.security.util.*; /** * This class encapsulates a Kerberos ticket and associated @@ -253,9 +250,10 @@ Date endTime, Date renewTill, InetAddress[] clientAddresses) { - if (sessionKey == null) - throw new IllegalArgumentException("Session key for ticket" - + " cannot be null"); + if (sessionKey == null) { + throw new IllegalArgumentException("Session key for ticket" + + " cannot be null"); + } init(asn1Encoding, client, server, new KeyImpl(sessionKey, keyType), flags, authTime, startTime, endTime, renewTill, clientAddresses); @@ -271,41 +269,46 @@ Date endTime, Date renewTill, InetAddress[] clientAddresses) { - if (asn1Encoding == null) - throw new IllegalArgumentException("ASN.1 encoding of ticket" - + " cannot be null"); + if (asn1Encoding == null) { + throw new IllegalArgumentException("ASN.1 encoding of ticket" + + " cannot be null"); + } this.asn1Encoding = asn1Encoding.clone(); - if (client == null) - throw new IllegalArgumentException("Client name in ticket" - + " cannot be null"); + if (client == null) { + throw new IllegalArgumentException("Client name in ticket" + + " cannot be null"); + } this.client = client; - if (server == null) - throw new IllegalArgumentException("Server name in ticket" - + " cannot be null"); + if (server == null) { + throw new IllegalArgumentException("Server name in ticket" + + " cannot be null"); + } this.server = server; // Caller needs to make sure `sessionKey` will not be null this.sessionKey = sessionKey; if (flags != null) { - if (flags.length >= NUM_FLAGS) - this.flags = flags.clone(); - else { + if (flags.length >= NUM_FLAGS) { + this.flags = flags.clone(); + } else { this.flags = new boolean[NUM_FLAGS]; // Fill in whatever we have - for (int i = 0; i < flags.length; i++) + for (int i = 0; i < flags.length; i++) { this.flags[i] = flags[i]; + } } - } else - this.flags = new boolean[NUM_FLAGS]; + } else { + this.flags = new boolean[NUM_FLAGS]; + } if (this.flags[RENEWABLE_TICKET_FLAG]) { - if (renewTill == null) - throw new IllegalArgumentException("The renewable period " + if (renewTill == null) { + throw new IllegalArgumentException("The renewable period " + "end time cannot be null for renewable tickets."); - + } this.renewTill = new Date(renewTill.getTime()); } @@ -318,13 +321,15 @@ this.startTime = this.authTime; } - if (endTime == null) - throw new IllegalArgumentException("End time for ticket validity" - + " cannot be null"); + if (endTime == null) { + throw new IllegalArgumentException("End time for ticket validity" + + " cannot be null"); + } this.endTime = new Date(endTime.getTime()); - if (clientAddresses != null) - this.clientAddresses = clientAddresses.clone(); + if (clientAddresses != null) { + this.clientAddresses = clientAddresses.clone(); + } } /** @@ -346,14 +351,17 @@ } /** - * Returns the session key associated with this ticket. + * Returns the session key associated with this ticket. The return value + * is always a {@link EncryptionKey} object. * * @return the session key. */ public final SecretKey getSessionKey() { - if (destroyed) + if (destroyed) { throw new IllegalStateException("This ticket is no longer valid"); - return sessionKey; + } + return new EncryptionKey( + sessionKey.getEncoded(), sessionKey.getKeyType()); } /** @@ -366,8 +374,9 @@ * @see #getSessionKey() */ public final int getSessionKeyType() { - if (destroyed) + if (destroyed) { throw new IllegalStateException("This ticket is no longer valid"); + } return sessionKey.getKeyType(); } @@ -508,8 +517,9 @@ * @return an ASN.1 encoding of the entire ticket. */ public final byte[] getEncoded() { - if (destroyed) + if (destroyed) { throw new IllegalStateException("This ticket is no longer valid"); + } return asn1Encoding.clone(); } @@ -539,16 +549,17 @@ */ public void refresh() throws RefreshFailedException { - if (destroyed) + if (destroyed) { throw new RefreshFailedException("A destroyed ticket " - + "cannot be renewd."); - - if (!isRenewable()) + + "cannot be renewd."); + } + if (!isRenewable()) { throw new RefreshFailedException("This ticket is not renewable"); - - if (System.currentTimeMillis() > getRenewTill().getTime()) + } + if (System.currentTimeMillis() > getRenewTill().getTime()) { throw new RefreshFailedException("This ticket is past " - + "its last renewal time."); + + "its last renewal time."); + } Throwable e = null; sun.security.krb5.Credentials krb5Creds = null; @@ -634,8 +645,9 @@ } public String toString() { - if (destroyed) - throw new IllegalStateException("This ticket is no longer valid"); + if (destroyed) { + return "Destroyed KerberosTicket"; + } StringBuilder caddrString = new StringBuilder(); if (clientAddresses != null) { for (int i = 0; i < clientAddresses.length; i++) { @@ -715,8 +727,9 @@ */ public boolean equals(Object other) { - if (other == this) + if (other == this) { return true; + } if (! (other instanceof KerberosTicket)) { return false; @@ -731,7 +744,7 @@ !endTime.equals(otherTicket.getEndTime()) || !server.equals(otherTicket.getServer()) || !client.equals(otherTicket.getClient()) || - !sessionKey.equals(otherTicket.getSessionKey()) || + !sessionKey.equals(otherTicket.sessionKey) || !Arrays.equals(clientAddresses, otherTicket.getClientAddresses()) || !Arrays.equals(flags, otherTicket.getFlags())) { return false; @@ -739,35 +752,41 @@ // authTime may be null if (authTime == null) { - if (otherTicket.getAuthTime() != null) + if (otherTicket.getAuthTime() != null) { return false; + } } else { - if (!authTime.equals(otherTicket.getAuthTime())) + if (!authTime.equals(otherTicket.getAuthTime())) { return false; + } } // startTime may be null if (startTime == null) { - if (otherTicket.getStartTime() != null) + if (otherTicket.getStartTime() != null) { return false; + } } else { - if (!startTime.equals(otherTicket.getStartTime())) + if (!startTime.equals(otherTicket.getStartTime())) { return false; + } } if (renewTill == null) { - if (otherTicket.getRenewTill() != null) + if (otherTicket.getRenewTill() != null) { return false; + } } else { - if (!renewTill.equals(otherTicket.getRenewTill())) + if (!renewTill.equals(otherTicket.getRenewTill())) { return false; + } } return true; } private void readObject(ObjectInputStream s) - throws IOException, ClassNotFoundException { + throws IOException, ClassNotFoundException { s.defaultReadObject(); if (sessionKey == null) { throw new InvalidObjectException("Session key cannot be null"); diff -r d553e7400295 -r 6c9ff31edda0 jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMKeyValue.java --- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMKeyValue.java Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMKeyValue.java Wed Jul 05 19:52:15 2017 +0200 @@ -364,7 +364,7 @@ } void getMethods() throws ClassNotFoundException, NoSuchMethodException { - Class c = Class.forName("sun.security.ec.ECParameters"); + Class c = Class.forName("sun.security.util.ECParameters"); Class[] params = new Class[] { ECPoint.class, EllipticCurve.class }; encodePoint = c.getMethod("encodePoint", params); @@ -372,7 +372,7 @@ getCurveName = c.getMethod("getCurveName", params); params = new Class[] { byte[].class, EllipticCurve.class }; decodePoint = c.getMethod("decodePoint", params); - c = Class.forName("sun.security.ec.NamedCurve"); + c = Class.forName("sun.security.util.NamedCurve"); params = new Class[] { String.class }; getECParameterSpec = c.getMethod("getECParameterSpec", params); } @@ -477,7 +477,7 @@ throw new MarshalException(ite); } /* - ecPoint = sun.security.ec.ECParameters.decodePoint( + ecPoint = sun.security.util.ECParameters.decodePoint( Base64.decode(curElem), ecParams.getCurve()); */ ECPublicKeySpec spec = new ECPublicKeySpec(ecPoint, ecParams); diff -r d553e7400295 -r 6c9ff31edda0 jdk/src/share/classes/sun/misc/JavaLangAccess.java --- a/jdk/src/share/classes/sun/misc/JavaLangAccess.java Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/src/share/classes/sun/misc/JavaLangAccess.java Wed Jul 05 19:52:15 2017 +0200 @@ -132,4 +132,14 @@ * Invokes the finalize method of the given object. */ void invokeFinalize(Object o) throws Throwable; + + /** + * Invokes Long.formatUnsignedLong(long val, int shift, char[] buf, int offset, int len) + */ + void formatUnsignedLong(long val, int shift, char[] buf, int offset, int len); + + /** + * Invokes Integer.formatUnsignedInt(long val, int shift, char[] buf, int offset, int len) + */ + void formatUnsignedInt(int val, int shift, char[] buf, int offset, int len); } diff -r d553e7400295 -r 6c9ff31edda0 jdk/src/share/classes/sun/nio/cs/ext/ExtendedCharsets.java --- a/jdk/src/share/classes/sun/nio/cs/ext/ExtendedCharsets.java Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/src/share/classes/sun/nio/cs/ext/ExtendedCharsets.java Wed Jul 05 19:52:15 2017 +0200 @@ -1173,8 +1173,7 @@ if (!sun.misc.VM.isBooted()) return; - String map = AccessController.doPrivileged( - (PrivilegedAction) () -> System.getProperty("sun.nio.cs.map")); + String map = getProperty("sun.nio.cs.map"); boolean sjisIsMS932 = false; boolean iso2022jpIsMS50221 = false; boolean iso2022jpIsMS50220 = false; @@ -1294,8 +1293,7 @@ } } - String osName = AccessController.doPrivileged( - (PrivilegedAction) () -> System.getProperty("os.name")); + String osName = getProperty("os.name"); if ("SunOS".equals(osName) || "Linux".equals(osName) || "AIX".equals(osName) || osName.contains("OS X")) { charset("x-COMPOUND_TEXT", "COMPOUND_TEXT", @@ -1308,6 +1306,18 @@ initialized = true; } + private static String getProperty(String key) { + // this method may be called during initialization of + // system class loader and thus not using lambda + return AccessController.doPrivileged( + new PrivilegedAction() { + @Override + public String run() { + return System.getProperty(key); + } + }); + } + public static String[] aliasesFor(String charsetName) { if (instance == null) return null; diff -r d553e7400295 -r 6c9ff31edda0 jdk/src/share/classes/sun/security/ec/CurveDB.java --- a/jdk/src/share/classes/sun/security/ec/CurveDB.java Wed Jul 30 11:49:21 2014 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,669 +0,0 @@ -/* - * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package sun.security.ec; - -import java.math.BigInteger; - -import java.security.spec.*; - -import java.util.*; -import java.util.regex.Pattern; - -/** - * Repository for well-known Elliptic Curve parameters. It is used by both - * the SunPKCS11 and SunJSSE code. - * - * @since 1.6 - * @author Andreas Sterbenz - */ -public class CurveDB { - private final static int P = 1; // prime curve - private final static int B = 2; // binary curve - private final static int PD = 5; // prime curve, mark as default - private final static int BD = 6; // binary curve, mark as default - - private static final Map oidMap = - new LinkedHashMap(); - private static final Map nameMap = - new HashMap(); - private static final Map lengthMap = - new HashMap(); - - private static Collection specCollection; - - static final String SPLIT_PATTERN = ",|\\[|\\]"; - - // Used by SunECEntries - static CollectiongetSupportedCurves() { - return specCollection; - } - - // Return a NamedCurve for the specified OID/name or null if unknown. - static NamedCurve lookup(String name) { - NamedCurve spec = oidMap.get(name); - if (spec != null) { - return spec; - } - - return nameMap.get(name); - } - - // Return EC parameters for the specified field size. If there are known - // NIST recommended parameters for the given length, they are returned. - // Otherwise, if there are multiple matches for the given size, an - // arbitrary one is returns. - // If no parameters are known, the method returns null. - // NOTE that this method returns both prime and binary curves. - static NamedCurve lookup(int length) { - return lengthMap.get(length); - } - - // Convert the given ECParameterSpec object to a NamedCurve object. - // If params does not represent a known named curve, return null. - static NamedCurve lookup(ECParameterSpec params) { - if ((params instanceof NamedCurve) || (params == null)) { - return (NamedCurve)params; - } - - // This is a hack to allow SunJSSE to work with 3rd party crypto - // providers for ECC and not just SunPKCS11. - // This can go away once we decide how to expose curve names in the - // public API. - // Note that it assumes that the 3rd party provider encodes named - // curves using the short form, not explicitly. If it did that, then - // the SunJSSE TLS ECC extensions are wrong, which could lead to - // interoperability problems. - int fieldSize = params.getCurve().getField().getFieldSize(); - for (NamedCurve namedCurve : specCollection) { - // ECParameterSpec does not define equals, so check all the - // components ourselves. - // Quick field size check first - if (namedCurve.getCurve().getField().getFieldSize() != fieldSize) { - continue; - } - if (namedCurve.getCurve().equals(params.getCurve()) == false) { - continue; - } - if (namedCurve.getGenerator().equals(params.getGenerator()) == - false) { - continue; - } - if (namedCurve.getOrder().equals(params.getOrder()) == false) { - continue; - } - if (namedCurve.getCofactor() != params.getCofactor()) { - continue; - } - // everything matches our named curve, return it - return namedCurve; - } - // no match found - return null; - } - - private static BigInteger bi(String s) { - return new BigInteger(s, 16); - } - - private static void add(String name, String soid, int type, String sfield, - String a, String b, String x, String y, String n, int h, - Pattern nameSplitPattern) { - BigInteger p = bi(sfield); - ECField field; - if ((type == P) || (type == PD)) { - field = new ECFieldFp(p); - } else if ((type == B) || (type == BD)) { - field = new ECFieldF2m(p.bitLength() - 1, p); - } else { - throw new RuntimeException("Invalid type: " + type); - } - - EllipticCurve curve = new EllipticCurve(field, bi(a), bi(b)); - ECPoint g = new ECPoint(bi(x), bi(y)); - - NamedCurve params = new NamedCurve(name, soid, curve, g, bi(n), h); - if (oidMap.put(soid, params) != null) { - throw new RuntimeException("Duplication oid: " + soid); - } - - String[] commonNames = nameSplitPattern.split(name); - for (String commonName : commonNames) { - if (nameMap.put(commonName.trim(), params) != null) { - throw new RuntimeException("Duplication name: " + commonName); - } - } - - int len = field.getFieldSize(); - if ((type == PD) || (type == BD) || (lengthMap.get(len) == null)) { - // add entry if none present for this field size or if - // the curve is marked as a default curve. - lengthMap.put(len, params); - } - } - - static { - Pattern nameSplitPattern = Pattern.compile(SPLIT_PATTERN); - - /* SEC2 prime curves */ - add("secp112r1", "1.3.132.0.6", P, - "DB7C2ABF62E35E668076BEAD208B", - "DB7C2ABF62E35E668076BEAD2088", - "659EF8BA043916EEDE8911702B22", - "09487239995A5EE76B55F9C2F098", - "A89CE5AF8724C0A23E0E0FF77500", - "DB7C2ABF62E35E7628DFAC6561C5", - 1, nameSplitPattern); - - add("secp112r2", "1.3.132.0.7", P, - "DB7C2ABF62E35E668076BEAD208B", - "6127C24C05F38A0AAAF65C0EF02C", - "51DEF1815DB5ED74FCC34C85D709", - "4BA30AB5E892B4E1649DD0928643", - "adcd46f5882e3747def36e956e97", - "36DF0AAFD8B8D7597CA10520D04B", - 4, nameSplitPattern); - - add("secp128r1", "1.3.132.0.28", P, - "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF", - "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFC", - "E87579C11079F43DD824993C2CEE5ED3", - "161FF7528B899B2D0C28607CA52C5B86", - "CF5AC8395BAFEB13C02DA292DDED7A83", - "FFFFFFFE0000000075A30D1B9038A115", - 1, nameSplitPattern); - - add("secp128r2", "1.3.132.0.29", P, - "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF", - "D6031998D1B3BBFEBF59CC9BBFF9AEE1", - "5EEEFCA380D02919DC2C6558BB6D8A5D", - "7B6AA5D85E572983E6FB32A7CDEBC140", - "27B6916A894D3AEE7106FE805FC34B44", - "3FFFFFFF7FFFFFFFBE0024720613B5A3", - 4, nameSplitPattern); - - add("secp160k1", "1.3.132.0.9", P, - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73", - "0000000000000000000000000000000000000000", - "0000000000000000000000000000000000000007", - "3B4C382CE37AA192A4019E763036F4F5DD4D7EBB", - "938CF935318FDCED6BC28286531733C3F03C4FEE", - "0100000000000000000001B8FA16DFAB9ACA16B6B3", - 1, nameSplitPattern); - - add("secp160r1", "1.3.132.0.8", P, - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF", - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFC", - "1C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45", - "4A96B5688EF573284664698968C38BB913CBFC82", - "23A628553168947D59DCC912042351377AC5FB32", - "0100000000000000000001F4C8F927AED3CA752257", - 1, nameSplitPattern); - - add("secp160r2", "1.3.132.0.30", P, - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73", - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC70", - "B4E134D3FB59EB8BAB57274904664D5AF50388BA", - "52DCB034293A117E1F4FF11B30F7199D3144CE6D", - "FEAFFEF2E331F296E071FA0DF9982CFEA7D43F2E", - "0100000000000000000000351EE786A818F3A1A16B", - 1, nameSplitPattern); - - add("secp192k1", "1.3.132.0.31", P, - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37", - "000000000000000000000000000000000000000000000000", - "000000000000000000000000000000000000000000000003", - "DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D", - "9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D", - "FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D", - 1, nameSplitPattern); - - add("secp192r1 [NIST P-192, X9.62 prime192v1]", "1.2.840.10045.3.1.1", PD, - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF", - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC", - "64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1", - "188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012", - "07192B95FFC8DA78631011ED6B24CDD573F977A11E794811", - "FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831", - 1, nameSplitPattern); - - add("secp224k1", "1.3.132.0.32", P, - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFE56D", - "00000000000000000000000000000000000000000000000000000000", - "00000000000000000000000000000000000000000000000000000005", - "A1455B334DF099DF30FC28A169A467E9E47075A90F7E650EB6B7A45C", - "7E089FED7FBA344282CAFBD6F7E319F7C0B0BD59E2CA4BDB556D61A5", - "010000000000000000000000000001DCE8D2EC6184CAF0A971769FB1F7", - 1, nameSplitPattern); - - add("secp224r1 [NIST P-224]", "1.3.132.0.33", PD, - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001", - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE", - "B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4", - "B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21", - "BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34", - "FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D", - 1, nameSplitPattern); - - add("secp256k1", "1.3.132.0.10", P, - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000000000000000000000000000000000000000000007", - "79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798", - "483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8", - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141", - 1, nameSplitPattern); - - add("secp256r1 [NIST P-256, X9.62 prime256v1]", "1.2.840.10045.3.1.7", PD, - "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", - "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", - "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", - "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296", - "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", - "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551", - 1, nameSplitPattern); - - add("secp384r1 [NIST P-384]", "1.3.132.0.34", PD, - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF", - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC", - "B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF", - "AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7", - "3617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F", - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973", - 1, nameSplitPattern); - - add("secp521r1 [NIST P-521]", "1.3.132.0.35", PD, - "01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", - "01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC", - "0051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00", - "00C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66", - "011839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650", - "01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409", - 1, nameSplitPattern); - - /* ANSI X9.62 prime curves */ - add("X9.62 prime192v2", "1.2.840.10045.3.1.2", P, - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF", - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC", - "CC22D6DFB95C6B25E49C0D6364A4E5980C393AA21668D953", - "EEA2BAE7E1497842F2DE7769CFE9C989C072AD696F48034A", - "6574D11D69B6EC7A672BB82A083DF2F2B0847DE970B2DE15", - "FFFFFFFFFFFFFFFFFFFFFFFE5FB1A724DC80418648D8DD31", - 1, nameSplitPattern); - - add("X9.62 prime192v3", "1.2.840.10045.3.1.3", P, - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF", - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC", - "22123DC2395A05CAA7423DAECCC94760A7D462256BD56916", - "7D29778100C65A1DA1783716588DCE2B8B4AEE8E228F1896", - "38A90F22637337334B49DCB66A6DC8F9978ACA7648A943B0", - "FFFFFFFFFFFFFFFFFFFFFFFF7A62D031C83F4294F640EC13", - 1, nameSplitPattern); - - add("X9.62 prime239v1", "1.2.840.10045.3.1.4", P, - "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF", - "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC", - "6B016C3BDCF18941D0D654921475CA71A9DB2FB27D1D37796185C2942C0A", - "0FFA963CDCA8816CCC33B8642BEDF905C3D358573D3F27FBBD3B3CB9AAAF", - "7DEBE8E4E90A5DAE6E4054CA530BA04654B36818CE226B39FCCB7B02F1AE", - "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFF9E5E9A9F5D9071FBD1522688909D0B", - 1, nameSplitPattern); - - add("X9.62 prime239v2", "1.2.840.10045.3.1.5", P, - "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF", - "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC", - "617FAB6832576CBBFED50D99F0249C3FEE58B94BA0038C7AE84C8C832F2C", - "38AF09D98727705120C921BB5E9E26296A3CDCF2F35757A0EAFD87B830E7", - "5B0125E4DBEA0EC7206DA0FC01D9B081329FB555DE6EF460237DFF8BE4BA", - "7FFFFFFFFFFFFFFFFFFFFFFF800000CFA7E8594377D414C03821BC582063", - 1, nameSplitPattern); - - add("X9.62 prime239v3", "1.2.840.10045.3.1.6", P, - "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF", - "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC", - "255705FA2A306654B1F4CB03D6A750A30C250102D4988717D9BA15AB6D3E", - "6768AE8E18BB92CFCF005C949AA2C6D94853D0E660BBF854B1C9505FE95A", - "1607E6898F390C06BC1D552BAD226F3B6FCFE48B6E818499AF18E3ED6CF3", - "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFF975DEB41B3A6057C3C432146526551", - 1, nameSplitPattern); - - /* SEC2 binary curves */ - add("sect113r1", "1.3.132.0.4", B, - "020000000000000000000000000201", - "003088250CA6E7C7FE649CE85820F7", - "00E8BEE4D3E2260744188BE0E9C723", - "009D73616F35F4AB1407D73562C10F", - "00A52830277958EE84D1315ED31886", - "0100000000000000D9CCEC8A39E56F", - 2, nameSplitPattern); - - add("sect113r2", "1.3.132.0.5", B, - "020000000000000000000000000201", - "00689918DBEC7E5A0DD6DFC0AA55C7", - "0095E9A9EC9B297BD4BF36E059184F", - "01A57A6A7B26CA5EF52FCDB8164797", - "00B3ADC94ED1FE674C06E695BABA1D", - "010000000000000108789B2496AF93", - 2, nameSplitPattern); - - add("sect131r1", "1.3.132.0.22", B, - "080000000000000000000000000000010D", - "07A11B09A76B562144418FF3FF8C2570B8", - "0217C05610884B63B9C6C7291678F9D341", - "0081BAF91FDF9833C40F9C181343638399", - "078C6E7EA38C001F73C8134B1B4EF9E150", - "0400000000000000023123953A9464B54D", - 2, nameSplitPattern); - - add("sect131r2", "1.3.132.0.23", B, - "080000000000000000000000000000010D", - "03E5A88919D7CAFCBF415F07C2176573B2", - "04B8266A46C55657AC734CE38F018F2192", - "0356DCD8F2F95031AD652D23951BB366A8", - "0648F06D867940A5366D9E265DE9EB240F", - "0400000000000000016954A233049BA98F", - 2, nameSplitPattern); - - add("sect163k1 [NIST K-163]", "1.3.132.0.1", BD, - "0800000000000000000000000000000000000000C9", - "000000000000000000000000000000000000000001", - "000000000000000000000000000000000000000001", - "02FE13C0537BBC11ACAA07D793DE4E6D5E5C94EEE8", - "0289070FB05D38FF58321F2E800536D538CCDAA3D9", - "04000000000000000000020108A2E0CC0D99F8A5EF", - 2, nameSplitPattern); - - add("sect163r1", "1.3.132.0.2", B, - "0800000000000000000000000000000000000000C9", - "07B6882CAAEFA84F9554FF8428BD88E246D2782AE2", - "0713612DCDDCB40AAB946BDA29CA91F73AF958AFD9", - "0369979697AB43897789566789567F787A7876A654", - "00435EDB42EFAFB2989D51FEFCE3C80988F41FF883", - "03FFFFFFFFFFFFFFFFFFFF48AAB689C29CA710279B", - 2, nameSplitPattern); - - add("sect163r2 [NIST B-163]", "1.3.132.0.15", BD, - "0800000000000000000000000000000000000000C9", - "000000000000000000000000000000000000000001", - "020A601907B8C953CA1481EB10512F78744A3205FD", - "03F0EBA16286A2D57EA0991168D4994637E8343E36", - "00D51FBC6C71A0094FA2CDD545B11C5C0C797324F1", - "040000000000000000000292FE77E70C12A4234C33", - 2, nameSplitPattern); - - add("sect193r1", "1.3.132.0.24", B, - "02000000000000000000000000000000000000000000008001", - "0017858FEB7A98975169E171F77B4087DE098AC8A911DF7B01", - "00FDFB49BFE6C3A89FACADAA7A1E5BBC7CC1C2E5D831478814", - "01F481BC5F0FF84A74AD6CDF6FDEF4BF6179625372D8C0C5E1", - "0025E399F2903712CCF3EA9E3A1AD17FB0B3201B6AF7CE1B05", - "01000000000000000000000000C7F34A778F443ACC920EBA49", - 2, nameSplitPattern); - - add("sect193r2", "1.3.132.0.25", B, - "02000000000000000000000000000000000000000000008001", - "0163F35A5137C2CE3EA6ED8667190B0BC43ECD69977702709B", - "00C9BB9E8927D4D64C377E2AB2856A5B16E3EFB7F61D4316AE", - "00D9B67D192E0367C803F39E1A7E82CA14A651350AAE617E8F", - "01CE94335607C304AC29E7DEFBD9CA01F596F927224CDECF6C", - "010000000000000000000000015AAB561B005413CCD4EE99D5", - 2, nameSplitPattern); - - add("sect233k1 [NIST K-233]", "1.3.132.0.26", BD, - "020000000000000000000000000000000000000004000000000000000001", - "000000000000000000000000000000000000000000000000000000000000", - "000000000000000000000000000000000000000000000000000000000001", - "017232BA853A7E731AF129F22FF4149563A419C26BF50A4C9D6EEFAD6126", - "01DB537DECE819B7F70F555A67C427A8CD9BF18AEB9B56E0C11056FAE6A3", - "008000000000000000000000000000069D5BB915BCD46EFB1AD5F173ABDF", - 4, nameSplitPattern); - - add("sect233r1 [NIST B-233]", "1.3.132.0.27", B, - "020000000000000000000000000000000000000004000000000000000001", - "000000000000000000000000000000000000000000000000000000000001", - "0066647EDE6C332C7F8C0923BB58213B333B20E9CE4281FE115F7D8F90AD", - "00FAC9DFCBAC8313BB2139F1BB755FEF65BC391F8B36F8F8EB7371FD558B", - "01006A08A41903350678E58528BEBF8A0BEFF867A7CA36716F7E01F81052", - "01000000000000000000000000000013E974E72F8A6922031D2603CFE0D7", - 2, nameSplitPattern); - - add("sect239k1", "1.3.132.0.3", B, - "800000000000000000004000000000000000000000000000000000000001", - "000000000000000000000000000000000000000000000000000000000000", - "000000000000000000000000000000000000000000000000000000000001", - "29A0B6A887A983E9730988A68727A8B2D126C44CC2CC7B2A6555193035DC", - "76310804F12E549BDB011C103089E73510ACB275FC312A5DC6B76553F0CA", - "2000000000000000000000000000005A79FEC67CB6E91F1C1DA800E478A5", - 4, nameSplitPattern); - - add("sect283k1 [NIST K-283]", "1.3.132.0.16", BD, - "0800000000000000000000000000000000000000000000000000000000000000000010A1", - "000000000000000000000000000000000000000000000000000000000000000000000000", - "000000000000000000000000000000000000000000000000000000000000000000000001", - "0503213F78CA44883F1A3B8162F188E553CD265F23C1567A16876913B0C2AC2458492836", - "01CCDA380F1C9E318D90F95D07E5426FE87E45C0E8184698E45962364E34116177DD2259", - "01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9AE2ED07577265DFF7F94451E061E163C61", - 4, nameSplitPattern); - - add("sect283r1 [NIST B-283]", "1.3.132.0.17", B, - "0800000000000000000000000000000000000000000000000000000000000000000010A1", - "000000000000000000000000000000000000000000000000000000000000000000000001", - "027B680AC8B8596DA5A4AF8A19A0303FCA97FD7645309FA2A581485AF6263E313B79A2F5", - "05F939258DB7DD90E1934F8C70B0DFEC2EED25B8557EAC9C80E2E198F8CDBECD86B12053", - "03676854FE24141CB98FE6D4B20D02B4516FF702350EDDB0826779C813F0DF45BE8112F4", - "03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF90399660FC938A90165B042A7CEFADB307", - 2, nameSplitPattern); - - add("sect409k1 [NIST K-409]", "1.3.132.0.36", BD, - "02000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000001", - "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", - "0060F05F658F49C1AD3AB1890F7184210EFD0987E307C84C27ACCFB8F9F67CC2C460189EB5AAAA62EE222EB1B35540CFE9023746", - "01E369050B7C4E42ACBA1DACBF04299C3460782F918EA427E6325165E9EA10E3DA5F6C42E9C55215AA9CA27A5863EC48D8E0286B", - "007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5F83B2D4EA20400EC4557D5ED3E3E7CA5B4B5C83B8E01E5FCF", - 4, nameSplitPattern); - - add("sect409r1 [NIST B-409]", "1.3.132.0.37", B, - "02000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000001", - "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", - "0021A5C2C8EE9FEB5C4B9A753B7B476B7FD6422EF1F3DD674761FA99D6AC27C8A9A197B272822F6CD57A55AA4F50AE317B13545F", - "015D4860D088DDB3496B0C6064756260441CDE4AF1771D4DB01FFE5B34E59703DC255A868A1180515603AEAB60794E54BB7996A7", - "0061B1CFAB6BE5F32BBFA78324ED106A7636B9C5A7BD198D0158AA4F5488D08F38514F1FDF4B4F40D2181B3681C364BA0273C706", - "010000000000000000000000000000000000000000000000000001E2AAD6A612F33307BE5FA47C3C9E052F838164CD37D9A21173", - 2, nameSplitPattern); - - add("sect571k1 [NIST K-571]", "1.3.132.0.38", BD, - "080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000425", - "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", - "026EB7A859923FBC82189631F8103FE4AC9CA2970012D5D46024804801841CA44370958493B205E647DA304DB4CEB08CBBD1BA39494776FB988B47174DCA88C7E2945283A01C8972", - "0349DC807F4FBF374F4AEADE3BCA95314DD58CEC9F307A54FFC61EFC006D8A2C9D4979C0AC44AEA74FBEBBB9F772AEDCB620B01A7BA7AF1B320430C8591984F601CD4C143EF1C7A3", - "020000000000000000000000000000000000000000000000000000000000000000000000131850E1F19A63E4B391A8DB917F4138B630D84BE5D639381E91DEB45CFE778F637C1001", - 4, nameSplitPattern); - - add("sect571r1 [NIST B-571]", "1.3.132.0.39", B, - "080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000425", - "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", - "02F40E7E2221F295DE297117B7F3D62F5C6A97FFCB8CEFF1CD6BA8CE4A9A18AD84FFABBD8EFA59332BE7AD6756A66E294AFD185A78FF12AA520E4DE739BACA0C7FFEFF7F2955727A", - "0303001D34B856296C16C0D40D3CD7750A93D1D2955FA80AA5F40FC8DB7B2ABDBDE53950F4C0D293CDD711A35B67FB1499AE60038614F1394ABFA3B4C850D927E1E7769C8EEC2D19", - "037BF27342DA639B6DCCFFFEB73D69D78C6C27A6009CBBCA1980F8533921E8A684423E43BAB08A576291AF8F461BB2A8B3531D2F0485C19B16E2F1516E23DD3C1A4827AF1B8AC15B", - "03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE661CE18FF55987308059B186823851EC7DD9CA1161DE93D5174D66E8382E9BB2FE84E47", - 2, nameSplitPattern); - - /* ANSI X9.62 binary curves */ - add("X9.62 c2tnb191v1", "1.2.840.10045.3.0.5", B, - "800000000000000000000000000000000000000000000201", - "2866537B676752636A68F56554E12640276B649EF7526267", - "2E45EF571F00786F67B0081B9495A3D95462F5DE0AA185EC", - "36B3DAF8A23206F9C4F299D7B21A9C369137F2C84AE1AA0D", - "765BE73433B3F95E332932E70EA245CA2418EA0EF98018FB", - "40000000000000000000000004A20E90C39067C893BBB9A5", - 2, nameSplitPattern); - - add("X9.62 c2tnb191v2", "1.2.840.10045.3.0.6", B, - "800000000000000000000000000000000000000000000201", - "401028774D7777C7B7666D1366EA432071274F89FF01E718", - "0620048D28BCBD03B6249C99182B7C8CD19700C362C46A01", - "3809B2B7CC1B28CC5A87926AAD83FD28789E81E2C9E3BF10", - "17434386626D14F3DBF01760D9213A3E1CF37AEC437D668A", - "20000000000000000000000050508CB89F652824E06B8173", - 4, nameSplitPattern); - - add("X9.62 c2tnb191v3", "1.2.840.10045.3.0.7", B, - "800000000000000000000000000000000000000000000201", - "6C01074756099122221056911C77D77E77A777E7E7E77FCB", - "71FE1AF926CF847989EFEF8DB459F66394D90F32AD3F15E8", - "375D4CE24FDE434489DE8746E71786015009E66E38A926DD", - "545A39176196575D985999366E6AD34CE0A77CD7127B06BE", - "155555555555555555555555610C0B196812BFB6288A3EA3", - 6, nameSplitPattern); - - add("X9.62 c2tnb239v1", "1.2.840.10045.3.0.11", B, - "800000000000000000000000000000000000000000000000001000000001", - "32010857077C5431123A46B808906756F543423E8D27877578125778AC76", - "790408F2EEDAF392B012EDEFB3392F30F4327C0CA3F31FC383C422AA8C16", - "57927098FA932E7C0A96D3FD5B706EF7E5F5C156E16B7E7C86038552E91D", - "61D8EE5077C33FECF6F1A16B268DE469C3C7744EA9A971649FC7A9616305", - "2000000000000000000000000000000F4D42FFE1492A4993F1CAD666E447", - 4, nameSplitPattern); - - add("X9.62 c2tnb239v2", "1.2.840.10045.3.0.12", B, - "800000000000000000000000000000000000000000000000001000000001", - "4230017757A767FAE42398569B746325D45313AF0766266479B75654E65F", - "5037EA654196CFF0CD82B2C14A2FCF2E3FF8775285B545722F03EACDB74B", - "28F9D04E900069C8DC47A08534FE76D2B900B7D7EF31F5709F200C4CA205", - "5667334C45AFF3B5A03BAD9DD75E2C71A99362567D5453F7FA6E227EC833", - "1555555555555555555555555555553C6F2885259C31E3FCDF154624522D", - 6, nameSplitPattern); - - add("X9.62 c2tnb239v3", "1.2.840.10045.3.0.13", B, - "800000000000000000000000000000000000000000000000001000000001", - "01238774666A67766D6676F778E676B66999176666E687666D8766C66A9F", - "6A941977BA9F6A435199ACFC51067ED587F519C5ECB541B8E44111DE1D40", - "70F6E9D04D289C4E89913CE3530BFDE903977D42B146D539BF1BDE4E9C92", - "2E5A0EAF6E5E1305B9004DCE5C0ED7FE59A35608F33837C816D80B79F461", - "0CCCCCCCCCCCCCCCCCCCCCCCCCCCCCAC4912D2D9DF903EF9888B8A0E4CFF", - 0xA, nameSplitPattern); - - add("X9.62 c2tnb359v1", "1.2.840.10045.3.0.18", B, - "800000000000000000000000000000000000000000000000000000000000000000000000100000000000000001", - "5667676A654B20754F356EA92017D946567C46675556F19556A04616B567D223A5E05656FB549016A96656A557", - "2472E2D0197C49363F1FE7F5B6DB075D52B6947D135D8CA445805D39BC345626089687742B6329E70680231988", - "3C258EF3047767E7EDE0F1FDAA79DAEE3841366A132E163ACED4ED2401DF9C6BDCDE98E8E707C07A2239B1B097", - "53D7E08529547048121E9C95F3791DD804963948F34FAE7BF44EA82365DC7868FE57E4AE2DE211305A407104BD", - "01AF286BCA1AF286BCA1AF286BCA1AF286BCA1AF286BC9FB8F6B85C556892C20A7EB964FE7719E74F490758D3B", - 0x4C, nameSplitPattern); - - add("X9.62 c2tnb431r1", "1.2.840.10045.3.0.20", B, - "800000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000001", - "1A827EF00DD6FC0E234CAF046C6A5D8A85395B236CC4AD2CF32A0CADBDC9DDF620B0EB9906D0957F6C6FEACD615468DF104DE296CD8F", - "10D9B4A3D9047D8B154359ABFB1B7F5485B04CEB868237DDC9DEDA982A679A5A919B626D4E50A8DD731B107A9962381FB5D807BF2618", - "120FC05D3C67A99DE161D2F4092622FECA701BE4F50F4758714E8A87BBF2A658EF8C21E7C5EFE965361F6C2999C0C247B0DBD70CE6B7", - "20D0AF8903A96F8D5FA2C255745D3C451B302C9346D9B7E485E7BCE41F6B591F3E8F6ADDCBB0BC4C2F947A7DE1A89B625D6A598B3760", - "0340340340340340340340340340340340340340340340340340340323C313FAB50589703B5EC68D3587FEC60D161CC149C1AD4A91", - 0x2760, nameSplitPattern); - - /* ANSI X9.62 binary curves from the 1998 standard but forbidden - * in the 2005 version of the standard. - * We don't register them but leave them here for the time being in - * case we need to support them after all. - */ -/* - add("X9.62 c2pnb163v1", "1.2.840.10045.3.0.1", B, - "080000000000000000000000000000000000000107", - "072546B5435234A422E0789675F432C89435DE5242", - "00C9517D06D5240D3CFF38C74B20B6CD4D6F9DD4D9", - "07AF69989546103D79329FCC3D74880F33BBE803CB", - "01EC23211B5966ADEA1D3F87F7EA5848AEF0B7CA9F", - "0400000000000000000001E60FC8821CC74DAEAFC1", - 2, nameSplitPattern); - - add("X9.62 c2pnb163v2", "1.2.840.10045.3.0.2", B, - "080000000000000000000000000000000000000107", - "0108B39E77C4B108BED981ED0E890E117C511CF072", - "0667ACEB38AF4E488C407433FFAE4F1C811638DF20", - "0024266E4EB5106D0A964D92C4860E2671DB9B6CC5", - "079F684DDF6684C5CD258B3890021B2386DFD19FC5", - "03FFFFFFFFFFFFFFFFFFFDF64DE1151ADBB78F10A7", - 2, nameSplitPattern); - - add("X9.62 c2pnb163v3", "1.2.840.10045.3.0.3", B, - "080000000000000000000000000000000000000107", - "07A526C63D3E25A256A007699F5447E32AE456B50E", - "03F7061798EB99E238FD6F1BF95B48FEEB4854252B", - "02F9F87B7C574D0BDECF8A22E6524775F98CDEBDCB", - "05B935590C155E17EA48EB3FF3718B893DF59A05D0", - "03FFFFFFFFFFFFFFFFFFFE1AEE140F110AFF961309", - 2, nameSplitPattern); - - add("X9.62 c2pnb176w1", "1.2.840.10045.3.0.4", B, - "0100000000000000000000000000000000080000000007", - "E4E6DB2995065C407D9D39B8D0967B96704BA8E9C90B", - "5DDA470ABE6414DE8EC133AE28E9BBD7FCEC0AE0FFF2", - "8D16C2866798B600F9F08BB4A8E860F3298CE04A5798", - "6FA4539C2DADDDD6BAB5167D61B436E1D92BB16A562C", - "00010092537397ECA4F6145799D62B0A19CE06FE26AD", - 0xFF6E, nameSplitPattern); - - add("X9.62 c2pnb208w1", "1.2.840.10045.3.0.10", B, - "010000000000000000000000000000000800000000000000000007", - "0000000000000000000000000000000000000000000000000000", - "C8619ED45A62E6212E1160349E2BFA844439FAFC2A3FD1638F9E", - "89FDFBE4ABE193DF9559ECF07AC0CE78554E2784EB8C1ED1A57A", - "0F55B51A06E78E9AC38A035FF520D8B01781BEB1A6BB08617DE3", - "000101BAF95C9723C57B6C21DA2EFF2D5ED588BDD5717E212F9D", - 0xFE48, nameSplitPattern); - - add("X9.62 c2pnb272w1", "1.2.840.10045.3.0.16", B, - "010000000000000000000000000000000000000000000000000000010000000000000B", - "91A091F03B5FBA4AB2CCF49C4EDD220FB028712D42BE752B2C40094DBACDB586FB20", - "7167EFC92BB2E3CE7C8AAAFF34E12A9C557003D7C73A6FAF003F99F6CC8482E540F7", - "6108BABB2CEEBCF787058A056CBE0CFE622D7723A289E08A07AE13EF0D10D171DD8D", - "10C7695716851EEF6BA7F6872E6142FBD241B830FF5EFCACECCAB05E02005DDE9D23", - "000100FAF51354E0E39E4892DF6E319C72C8161603FA45AA7B998A167B8F1E629521", - 0xFF06, nameSplitPattern); - - add("X9.62 c2pnb304w1", "1.2.840.10045.3.0.17", B, - "010000000000000000000000000000000000000000000000000000000000000000000000000807", - "FD0D693149A118F651E6DCE6802085377E5F882D1B510B44160074C1288078365A0396C8E681", - "BDDB97E555A50A908E43B01C798EA5DAA6788F1EA2794EFCF57166B8C14039601E55827340BE", - "197B07845E9BE2D96ADB0F5F3C7F2CFFBD7A3EB8B6FEC35C7FD67F26DDF6285A644F740A2614", - "E19FBEB76E0DA171517ECF401B50289BF014103288527A9B416A105E80260B549FDC1B92C03B", - "000101D556572AABAC800101D556572AABAC8001022D5C91DD173F8FB561DA6899164443051D", - 0xFE2E, nameSplitPattern); - - add("X9.62 c2pnb368w1", "1.2.840.10045.3.0.19", B, - "0100000000000000000000000000000000000000000000000000000000000000000000002000000000000000000007", - "E0D2EE25095206F5E2A4F9ED229F1F256E79A0E2B455970D8D0D865BD94778C576D62F0AB7519CCD2A1A906AE30D", - "FC1217D4320A90452C760A58EDCD30C8DD069B3C34453837A34ED50CB54917E1C2112D84D164F444F8F74786046A", - "1085E2755381DCCCE3C1557AFA10C2F0C0C2825646C5B34A394CBCFA8BC16B22E7E789E927BE216F02E1FB136A5F", - "7B3EB1BDDCBA62D5D8B2059B525797FC73822C59059C623A45FF3843CEE8F87CD1855ADAA81E2A0750B80FDA2310", - "00010090512DA9AF72B08349D98A5DD4C7B0532ECA51CE03E2D10F3B7AC579BD87E909AE40A6F131E9CFCE5BD967", - 0xFF70, nameSplitPattern); -*/ - - specCollection = Collections.unmodifiableCollection(oidMap.values()); - } -} diff -r d553e7400295 -r 6c9ff31edda0 jdk/src/share/classes/sun/security/ec/ECKeyPairGenerator.java --- a/jdk/src/share/classes/sun/security/ec/ECKeyPairGenerator.java Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/src/share/classes/sun/security/ec/ECKeyPairGenerator.java Wed Jul 05 19:52:15 2017 +0200 @@ -32,11 +32,10 @@ import java.security.spec.ECParameterSpec; import java.security.spec.ECPoint; -import sun.security.ec.NamedCurve; -import sun.security.ec.ECParameters; import sun.security.ec.ECPrivateKeyImpl; import sun.security.ec.ECPublicKeyImpl; import sun.security.jca.JCAUtil; +import sun.security.util.ECParameters; import sun.security.util.ECUtil; /** diff -r d553e7400295 -r 6c9ff31edda0 jdk/src/share/classes/sun/security/ec/ECParameters.java --- a/jdk/src/share/classes/sun/security/ec/ECParameters.java Wed Jul 30 11:49:21 2014 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,238 +0,0 @@ -/* - * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package sun.security.ec; - -import java.io.IOException; - -import java.security.*; -import java.security.spec.*; - -import sun.security.util.*; - -/** - * This class implements encoding and decoding of Elliptic Curve parameters - * as specified in RFC 3279. - * - * However, only named curves are currently supported. - * - * ASN.1 from RFC 3279 follows. Note that X9.62 (2005) has added some additional - * options. - * - *
    - *    EcpkParameters ::= CHOICE {
    - *      ecParameters  ECParameters,
    - *      namedCurve    OBJECT IDENTIFIER,
    - *      implicitlyCA  NULL }
    - *
    - *    ECParameters ::= SEQUENCE {
    - *       version   ECPVer,          -- version is always 1
    - *       fieldID   FieldID,         -- identifies the finite field over
    - *                                  -- which the curve is defined
    - *       curve     Curve,           -- coefficients a and b of the
    - *                                  -- elliptic curve
    - *       base      ECPoint,         -- specifies the base point P
    - *                                  -- on the elliptic curve
    - *       order     INTEGER,         -- the order n of the base point
    - *       cofactor  INTEGER OPTIONAL -- The integer h = #E(Fq)/n
    - *       }
    - *
    - *    ECPVer ::= INTEGER {ecpVer1(1)}
    - *
    - *    Curve ::= SEQUENCE {
    - *       a         FieldElement,
    - *       b         FieldElement,
    - *       seed      BIT STRING OPTIONAL }
    - *
    - *    FieldElement ::= OCTET STRING
    - *
    - *    ECPoint ::= OCTET STRING
    - * 
    - * - * @since 1.6 - * @author Andreas Sterbenz - */ -public final class ECParameters extends AlgorithmParametersSpi { - - // used by ECPublicKeyImpl and ECPrivateKeyImpl - static AlgorithmParameters getAlgorithmParameters(ECParameterSpec spec) - throws InvalidKeyException { - try { - AlgorithmParameters params = - AlgorithmParameters.getInstance("EC", "SunEC"); - params.init(spec); - return params; - } catch (GeneralSecurityException e) { - throw new InvalidKeyException("EC parameters error", e); - } - } - - /* - * The parameters these AlgorithmParameters object represents. - * Currently, it is always an instance of NamedCurve. - */ - private NamedCurve namedCurve; - - // A public constructor is required by AlgorithmParameters class. - public ECParameters() { - // empty - } - - // AlgorithmParameterSpi methods - - protected void engineInit(AlgorithmParameterSpec paramSpec) - throws InvalidParameterSpecException { - - if (paramSpec == null) { - throw new InvalidParameterSpecException - ("paramSpec must not be null"); - } - - if (paramSpec instanceof NamedCurve) { - namedCurve = (NamedCurve)paramSpec; - return; - } - - if (paramSpec instanceof ECParameterSpec) { - namedCurve = CurveDB.lookup((ECParameterSpec)paramSpec); - } else if (paramSpec instanceof ECGenParameterSpec) { - String name = ((ECGenParameterSpec)paramSpec).getName(); - namedCurve = CurveDB.lookup(name); - } else if (paramSpec instanceof ECKeySizeParameterSpec) { - int keySize = ((ECKeySizeParameterSpec)paramSpec).getKeySize(); - namedCurve = CurveDB.lookup(keySize); - } else { - throw new InvalidParameterSpecException - ("Only ECParameterSpec and ECGenParameterSpec supported"); - } - - if (namedCurve == null) { - throw new InvalidParameterSpecException( - "Not a supported curve: " + paramSpec); - } - } - - protected void engineInit(byte[] params) throws IOException { - DerValue encodedParams = new DerValue(params); - if (encodedParams.tag == DerValue.tag_ObjectId) { - ObjectIdentifier oid = encodedParams.getOID(); - NamedCurve spec = CurveDB.lookup(oid.toString()); - if (spec == null) { - throw new IOException("Unknown named curve: " + oid); - } - - namedCurve = spec; - return; - } - - throw new IOException("Only named ECParameters supported"); - - // The code below is incomplete. - // It is left as a starting point for a complete parsing implementation. - -/* - if (encodedParams.tag != DerValue.tag_Sequence) { - throw new IOException("Unsupported EC parameters, tag: " + - encodedParams.tag); - } - - encodedParams.data.reset(); - - DerInputStream in = encodedParams.data; - - int version = in.getInteger(); - if (version != 1) { - throw new IOException("Unsupported EC parameters version: " + - version); - } - ECField field = parseField(in); - EllipticCurve curve = parseCurve(in, field); - ECPoint point = parsePoint(in, curve); - - BigInteger order = in.getBigInteger(); - int cofactor = 0; - - if (in.available() != 0) { - cofactor = in.getInteger(); - } - - // XXX HashAlgorithm optional - - if (encodedParams.data.available() != 0) { - throw new IOException("encoded params have " + - encodedParams.data.available() + - " extra bytes"); - } - - return new ECParameterSpec(curve, point, order, cofactor); -*/ - } - - protected void engineInit(byte[] params, String decodingMethod) - throws IOException { - engineInit(params); - } - - protected T - engineGetParameterSpec(Class spec) - throws InvalidParameterSpecException { - - if (spec.isAssignableFrom(ECParameterSpec.class)) { - return spec.cast(namedCurve); - } - - if (spec.isAssignableFrom(ECGenParameterSpec.class)) { - // Ensure the name is the Object ID - String name = namedCurve.getObjectId(); - return spec.cast(new ECGenParameterSpec(name)); - } - - if (spec.isAssignableFrom(ECKeySizeParameterSpec.class)) { - int keySize = namedCurve.getCurve().getField().getFieldSize(); - return spec.cast(new ECKeySizeParameterSpec(keySize)); - } - - throw new InvalidParameterSpecException( - "Only ECParameterSpec and ECGenParameterSpec supported"); - } - - protected byte[] engineGetEncoded() throws IOException { - return namedCurve.getEncoded(); - } - - protected byte[] engineGetEncoded(String encodingMethod) - throws IOException { - return engineGetEncoded(); - } - - protected String engineToString() { - if (namedCurve == null) { - return "Not initialized"; - } - - return namedCurve.toString(); - } -} - diff -r d553e7400295 -r 6c9ff31edda0 jdk/src/share/classes/sun/security/ec/ECPrivateKeyImpl.java --- a/jdk/src/share/classes/sun/security/ec/ECPrivateKeyImpl.java Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/src/share/classes/sun/security/ec/ECPrivateKeyImpl.java Wed Jul 05 19:52:15 2017 +0200 @@ -32,7 +32,11 @@ import java.security.interfaces.*; import java.security.spec.*; -import sun.security.util.*; +import sun.security.util.DerInputStream; +import sun.security.util.DerOutputStream; +import sun.security.util.DerValue; +import sun.security.util.ECParameters; +import sun.security.util.ECUtil; import sun.security.x509.AlgorithmId; import sun.security.pkcs.PKCS8Key; diff -r d553e7400295 -r 6c9ff31edda0 jdk/src/share/classes/sun/security/ec/ECPublicKeyImpl.java --- a/jdk/src/share/classes/sun/security/ec/ECPublicKeyImpl.java Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/src/share/classes/sun/security/ec/ECPublicKeyImpl.java Wed Jul 05 19:52:15 2017 +0200 @@ -31,7 +31,9 @@ import java.security.interfaces.*; import java.security.spec.*; -import sun.security.util.*; +import sun.security.util.ECParameters; +import sun.security.util.ECUtil; + import sun.security.x509.*; /** diff -r d553e7400295 -r 6c9ff31edda0 jdk/src/share/classes/sun/security/ec/NamedCurve.java --- a/jdk/src/share/classes/sun/security/ec/NamedCurve.java Wed Jul 30 11:49:21 2014 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,86 +0,0 @@ -/* - * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package sun.security.ec; - -import java.io.IOException; -import java.math.BigInteger; - -import java.security.spec.*; - -import sun.security.util.DerOutputStream; -import sun.security.util.ObjectIdentifier; - - -/** - * Contains Elliptic Curve parameters. - * - * @since 1.6 - * @author Andreas Sterbenz - */ -class NamedCurve extends ECParameterSpec { - - // friendly name for toString() output - private final String name; - - // well known OID - private final String oid; - - // encoded form (as NamedCurve identified via OID) - private final byte[] encoded; - - NamedCurve(String name, String oid, EllipticCurve curve, - ECPoint g, BigInteger n, int h) { - super(curve, g, n, h); - this.name = name; - this.oid = oid; - - DerOutputStream out = new DerOutputStream(); - - try { - out.putOID(new ObjectIdentifier(oid)); - } catch (IOException e) { - throw new RuntimeException("Internal error", e); - } - - encoded = out.toByteArray(); - } - - String getName() { - return name; - } - - byte[] getEncoded() { - return encoded.clone(); - } - - String getObjectId() { - return oid; - } - - public String toString() { - return name + " (" + oid + ")"; - } -} diff -r d553e7400295 -r 6c9ff31edda0 jdk/src/share/classes/sun/security/ec/SunECEntries.java --- a/jdk/src/share/classes/sun/security/ec/SunECEntries.java Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/src/share/classes/sun/security/ec/SunECEntries.java Wed Jul 05 19:52:15 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,6 +29,8 @@ import java.util.Map; import java.util.regex.Pattern; +import sun.security.util.CurveDB; +import sun.security.util.NamedCurve; /** * Defines the entries of the SunEC provider. @@ -55,7 +57,7 @@ /* * Algorithm Parameter engine */ - map.put("AlgorithmParameters.EC", "sun.security.ec.ECParameters"); + map.put("AlgorithmParameters.EC", "sun.security.util.ECParameters"); map.put("Alg.Alias.AlgorithmParameters.EllipticCurve", "EC"); map.put("Alg.Alias.AlgorithmParameters.1.2.840.10045.2.1", "EC"); diff -r d553e7400295 -r 6c9ff31edda0 jdk/src/share/classes/sun/security/jgss/krb5/Krb5Context.java --- a/jdk/src/share/classes/sun/security/jgss/krb5/Krb5Context.java Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/src/share/classes/sun/security/jgss/krb5/Krb5Context.java Wed Jul 05 19:52:15 2017 +0200 @@ -40,11 +40,13 @@ import java.security.AccessController; import java.security.AccessControlContext; import java.security.Key; +import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; -import java.security.PrivilegedActionException; -import javax.crypto.Cipher; import javax.security.auth.Subject; -import javax.security.auth.kerberos.*; +import javax.security.auth.kerberos.ServicePermission; +import javax.security.auth.kerberos.KerberosCredMessage; +import javax.security.auth.kerberos.KerberosPrincipal; +import javax.security.auth.kerberos.KerberosTicket; import sun.security.krb5.internal.Ticket; /** @@ -118,6 +120,7 @@ // XXX See if the required info from these can be extracted and // stored elsewhere + private Credentials tgt; private Credentials serviceCreds; private KrbApReq apReq; Ticket serviceTicket; @@ -616,7 +619,6 @@ "No TGT available"); } myName = (Krb5NameElement) myCred.getName(); - Credentials tgt; final Krb5ProxyCredential second; if (myCred instanceof Krb5InitCredential) { second = null; @@ -750,7 +752,6 @@ // No need to write anything; // just validate the incoming token new AcceptSecContextToken(this, serviceCreds, apReq, is); - serviceCreds = null; apReq = null; state = STATE_DONE; } else { @@ -1304,6 +1305,9 @@ public final void dispose() throws GSSException { state = STATE_DELETED; delegatedCred = null; + tgt = null; + serviceCreds = null; + key = null; } public final Provider getProvider() { @@ -1424,6 +1428,9 @@ switch (type) { case KRB5_GET_SESSION_KEY: return new KerberosSessionKey(key); + case KRB5_GET_SESSION_KEY_EX: + return new javax.security.auth.kerberos.EncryptionKey( + key.getBytes(), key.getEType()); case KRB5_GET_TKT_FLAGS: return tktFlags.clone(); case KRB5_GET_AUTHZ_DATA: @@ -1435,6 +1442,26 @@ } case KRB5_GET_AUTHTIME: return authTime; + case KRB5_GET_KRB_CRED: + if (!isInitiator()) { + throw new GSSException(GSSException.UNAVAILABLE, -1, + "KRB_CRED not available on acceptor side."); + } + KerberosPrincipal sender = new KerberosPrincipal( + myName.getKrb5PrincipalName().getName()); + KerberosPrincipal recipient = new KerberosPrincipal( + peerName.getKrb5PrincipalName().getName()); + try { + byte[] krbCred = new KrbCred(tgt, serviceCreds, key) + .getMessage(); + return new KerberosCredMessage( + sender, recipient, krbCred); + } catch (KrbException | IOException e) { + GSSException gsse = new GSSException(GSSException.UNAVAILABLE, -1, + "KRB_CRED not generated correctly."); + gsse.initCause(e); + throw gsse; + } } throw new GSSException(GSSException.UNAVAILABLE, -1, "Inquire type not supported."); @@ -1456,4 +1483,5 @@ public void setAuthzData(com.sun.security.jgss.AuthorizationDataEntry[] authzData) { this.authzData = authzData; } + } diff -r d553e7400295 -r 6c9ff31edda0 jdk/src/share/classes/sun/security/jgss/krb5/Krb5InitCredential.java --- a/jdk/src/share/classes/sun/security/jgss/krb5/Krb5InitCredential.java Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/src/share/classes/sun/security/jgss/krb5/Krb5InitCredential.java Wed Jul 05 19:52:15 2017 +0200 @@ -29,8 +29,8 @@ import sun.security.jgss.GSSCaller; import sun.security.jgss.spi.*; import sun.security.krb5.*; -import sun.security.krb5.Config; -import javax.security.auth.kerberos.*; +import javax.security.auth.kerberos.KerberosTicket; +import javax.security.auth.kerberos.KerberosPrincipal; import java.net.InetAddress; import java.io.IOException; import java.util.Date; diff -r d553e7400295 -r 6c9ff31edda0 jdk/src/share/classes/sun/security/jgss/spnego/SpNegoContext.java --- a/jdk/src/share/classes/sun/security/jgss/spnego/SpNegoContext.java Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/src/share/classes/sun/security/jgss/spnego/SpNegoContext.java Wed Jul 05 19:52:15 2017 +0200 @@ -523,13 +523,6 @@ valid = false; } - // get the mechanism token - byte[] mechToken = initToken.getMechToken(); - if (mechToken == null) { - throw new GSSException(GSSException.FAILURE, -1, - "mechToken is missing"); - } - /* * Select the best match between the list of mechs * that the initiator requested and the list that @@ -545,7 +538,19 @@ internal_mech = mech_wanted; // get the token for mechanism - byte[] accept_token = GSS_acceptSecContext(mechToken); + byte[] accept_token; + + if (mechList[0].equals(mech_wanted)) { + // get the mechanism token + byte[] mechToken = initToken.getMechToken(); + if (mechToken == null) { + throw new GSSException(GSSException.FAILURE, -1, + "mechToken is missing"); + } + accept_token = GSS_acceptSecContext(mechToken); + } else { + accept_token = null; + } // verify MIC if (!GSSUtil.useMSInterop() && valid) { @@ -594,9 +599,27 @@ retVal = targToken.getEncoded(); } else if (state == STATE_IN_PROCESS) { + // read data + byte[] token = new byte[is.available()]; + SpNegoToken.readFully(is, token); + if (DEBUG) { + System.out.println("SpNegoContext.acceptSecContext: " + + "receiving token = " + + SpNegoToken.getHexBytes(token)); + } + + // read the SPNEGO token + // token will be validated when parsing + NegTokenTarg inputToken = new NegTokenTarg(token); + + if (DEBUG) { + System.out.println("SpNegoContext.acceptSecContext: " + + "received token of type = " + + SpNegoToken.getTokenName(inputToken.getType())); + } + // read the token - byte[] client_token = new byte[is.available()]; - SpNegoToken.readFully(is, client_token); + byte[] client_token = inputToken.getResponseToken(); byte[] accept_token = GSS_acceptSecContext(client_token); if (accept_token == null) { valid = false; @@ -1055,7 +1078,7 @@ * This is only valid on the acceptor side of the context. * @return GSSCredentialSpi object for the delegated credential * @exception GSSException - * @see GSSContext#getDelegCredState + * @see GSSContext#getCredDelegState */ public final GSSCredentialSpi getDelegCred() throws GSSException { if (state != STATE_IN_PROCESS && state != STATE_DONE) diff -r d553e7400295 -r 6c9ff31edda0 jdk/src/share/classes/sun/security/pkcs11/P11KeyStore.java --- a/jdk/src/share/classes/sun/security/pkcs11/P11KeyStore.java Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/src/share/classes/sun/security/pkcs11/P11KeyStore.java Wed Jul 05 19:52:15 2017 +0200 @@ -67,8 +67,6 @@ import sun.security.util.DerValue; import sun.security.util.ECUtil; -import sun.security.ec.ECParameters; - import sun.security.pkcs11.Secmod.*; import static sun.security.pkcs11.P11Util.*; diff -r d553e7400295 -r 6c9ff31edda0 jdk/src/share/classes/sun/security/pkcs11/SunPKCS11.java --- a/jdk/src/share/classes/sun/security/pkcs11/SunPKCS11.java Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/src/share/classes/sun/security/pkcs11/SunPKCS11.java Wed Jul 05 19:52:15 2017 +0200 @@ -593,7 +593,7 @@ // AlgorithmParameters for EC. // Only needed until we have an EC implementation in the SUN provider. - d(AGP, "EC", "sun.security.ec.ECParameters", + d(AGP, "EC", "sun.security.util.ECParameters", s("1.2.840.10045.2.1"), m(CKM_EC_KEY_PAIR_GEN, CKM_ECDH1_DERIVE, CKM_ECDSA, CKM_ECDSA_SHA1)); @@ -1032,7 +1032,7 @@ } else if (type == KS) { return token.getKeyStore(); } else if (type == AGP) { - return new sun.security.ec.ECParameters(); + return new sun.security.util.ECParameters(); } else { throw new NoSuchAlgorithmException("Unknown type: " + type); } diff -r d553e7400295 -r 6c9ff31edda0 jdk/src/share/classes/sun/security/ssl/SupportedEllipticCurvesExtension.java --- a/jdk/src/share/classes/sun/security/ssl/SupportedEllipticCurvesExtension.java Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/src/share/classes/sun/security/ssl/SupportedEllipticCurvesExtension.java Wed Jul 05 19:52:15 2017 +0200 @@ -176,7 +176,7 @@ private final static int ARBITRARY_PRIME = 0xff01; private final static int ARBITRARY_CHAR2 = 0xff02; - // See sun.security.ec.NamedCurve for the OIDs + // See sun.security.util.NamedCurve for the OIDs private final static String[] NAMED_CURVE_OID_TABLE = new String[] { null, // (0) unused "1.3.132.0.1", // (1) sect163k1, NIST K-163 diff -r d553e7400295 -r 6c9ff31edda0 jdk/src/share/classes/sun/security/util/CurveDB.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/sun/security/util/CurveDB.java Wed Jul 05 19:52:15 2017 +0200 @@ -0,0 +1,669 @@ +/* + * Copyright (c) 2006, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.security.util; + +import java.math.BigInteger; + +import java.security.spec.*; + +import java.util.*; +import java.util.regex.Pattern; + +/** + * Repository for well-known Elliptic Curve parameters. It is used by both + * the SunPKCS11 and SunJSSE code. + * + * @since 1.6 + * @author Andreas Sterbenz + */ +public class CurveDB { + private final static int P = 1; // prime curve + private final static int B = 2; // binary curve + private final static int PD = 5; // prime curve, mark as default + private final static int BD = 6; // binary curve, mark as default + + private static final Map oidMap = + new LinkedHashMap(); + private static final Map nameMap = + new HashMap(); + private static final Map lengthMap = + new HashMap(); + + private static Collection specCollection; + + public static final String SPLIT_PATTERN = ",|\\[|\\]"; + + // Used by SunECEntries + public static CollectiongetSupportedCurves() { + return specCollection; + } + + // Return a NamedCurve for the specified OID/name or null if unknown. + static NamedCurve lookup(String name) { + NamedCurve spec = oidMap.get(name); + if (spec != null) { + return spec; + } + + return nameMap.get(name); + } + + // Return EC parameters for the specified field size. If there are known + // NIST recommended parameters for the given length, they are returned. + // Otherwise, if there are multiple matches for the given size, an + // arbitrary one is returns. + // If no parameters are known, the method returns null. + // NOTE that this method returns both prime and binary curves. + static NamedCurve lookup(int length) { + return lengthMap.get(length); + } + + // Convert the given ECParameterSpec object to a NamedCurve object. + // If params does not represent a known named curve, return null. + static NamedCurve lookup(ECParameterSpec params) { + if ((params instanceof NamedCurve) || (params == null)) { + return (NamedCurve)params; + } + + // This is a hack to allow SunJSSE to work with 3rd party crypto + // providers for ECC and not just SunPKCS11. + // This can go away once we decide how to expose curve names in the + // public API. + // Note that it assumes that the 3rd party provider encodes named + // curves using the short form, not explicitly. If it did that, then + // the SunJSSE TLS ECC extensions are wrong, which could lead to + // interoperability problems. + int fieldSize = params.getCurve().getField().getFieldSize(); + for (NamedCurve namedCurve : specCollection) { + // ECParameterSpec does not define equals, so check all the + // components ourselves. + // Quick field size check first + if (namedCurve.getCurve().getField().getFieldSize() != fieldSize) { + continue; + } + if (namedCurve.getCurve().equals(params.getCurve()) == false) { + continue; + } + if (namedCurve.getGenerator().equals(params.getGenerator()) == + false) { + continue; + } + if (namedCurve.getOrder().equals(params.getOrder()) == false) { + continue; + } + if (namedCurve.getCofactor() != params.getCofactor()) { + continue; + } + // everything matches our named curve, return it + return namedCurve; + } + // no match found + return null; + } + + private static BigInteger bi(String s) { + return new BigInteger(s, 16); + } + + private static void add(String name, String soid, int type, String sfield, + String a, String b, String x, String y, String n, int h, + Pattern nameSplitPattern) { + BigInteger p = bi(sfield); + ECField field; + if ((type == P) || (type == PD)) { + field = new ECFieldFp(p); + } else if ((type == B) || (type == BD)) { + field = new ECFieldF2m(p.bitLength() - 1, p); + } else { + throw new RuntimeException("Invalid type: " + type); + } + + EllipticCurve curve = new EllipticCurve(field, bi(a), bi(b)); + ECPoint g = new ECPoint(bi(x), bi(y)); + + NamedCurve params = new NamedCurve(name, soid, curve, g, bi(n), h); + if (oidMap.put(soid, params) != null) { + throw new RuntimeException("Duplication oid: " + soid); + } + + String[] commonNames = nameSplitPattern.split(name); + for (String commonName : commonNames) { + if (nameMap.put(commonName.trim(), params) != null) { + throw new RuntimeException("Duplication name: " + commonName); + } + } + + int len = field.getFieldSize(); + if ((type == PD) || (type == BD) || (lengthMap.get(len) == null)) { + // add entry if none present for this field size or if + // the curve is marked as a default curve. + lengthMap.put(len, params); + } + } + + static { + Pattern nameSplitPattern = Pattern.compile(SPLIT_PATTERN); + + /* SEC2 prime curves */ + add("secp112r1", "1.3.132.0.6", P, + "DB7C2ABF62E35E668076BEAD208B", + "DB7C2ABF62E35E668076BEAD2088", + "659EF8BA043916EEDE8911702B22", + "09487239995A5EE76B55F9C2F098", + "A89CE5AF8724C0A23E0E0FF77500", + "DB7C2ABF62E35E7628DFAC6561C5", + 1, nameSplitPattern); + + add("secp112r2", "1.3.132.0.7", P, + "DB7C2ABF62E35E668076BEAD208B", + "6127C24C05F38A0AAAF65C0EF02C", + "51DEF1815DB5ED74FCC34C85D709", + "4BA30AB5E892B4E1649DD0928643", + "adcd46f5882e3747def36e956e97", + "36DF0AAFD8B8D7597CA10520D04B", + 4, nameSplitPattern); + + add("secp128r1", "1.3.132.0.28", P, + "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF", + "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFC", + "E87579C11079F43DD824993C2CEE5ED3", + "161FF7528B899B2D0C28607CA52C5B86", + "CF5AC8395BAFEB13C02DA292DDED7A83", + "FFFFFFFE0000000075A30D1B9038A115", + 1, nameSplitPattern); + + add("secp128r2", "1.3.132.0.29", P, + "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF", + "D6031998D1B3BBFEBF59CC9BBFF9AEE1", + "5EEEFCA380D02919DC2C6558BB6D8A5D", + "7B6AA5D85E572983E6FB32A7CDEBC140", + "27B6916A894D3AEE7106FE805FC34B44", + "3FFFFFFF7FFFFFFFBE0024720613B5A3", + 4, nameSplitPattern); + + add("secp160k1", "1.3.132.0.9", P, + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73", + "0000000000000000000000000000000000000000", + "0000000000000000000000000000000000000007", + "3B4C382CE37AA192A4019E763036F4F5DD4D7EBB", + "938CF935318FDCED6BC28286531733C3F03C4FEE", + "0100000000000000000001B8FA16DFAB9ACA16B6B3", + 1, nameSplitPattern); + + add("secp160r1", "1.3.132.0.8", P, + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF", + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFC", + "1C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45", + "4A96B5688EF573284664698968C38BB913CBFC82", + "23A628553168947D59DCC912042351377AC5FB32", + "0100000000000000000001F4C8F927AED3CA752257", + 1, nameSplitPattern); + + add("secp160r2", "1.3.132.0.30", P, + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73", + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC70", + "B4E134D3FB59EB8BAB57274904664D5AF50388BA", + "52DCB034293A117E1F4FF11B30F7199D3144CE6D", + "FEAFFEF2E331F296E071FA0DF9982CFEA7D43F2E", + "0100000000000000000000351EE786A818F3A1A16B", + 1, nameSplitPattern); + + add("secp192k1", "1.3.132.0.31", P, + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37", + "000000000000000000000000000000000000000000000000", + "000000000000000000000000000000000000000000000003", + "DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D", + "9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D", + "FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D", + 1, nameSplitPattern); + + add("secp192r1 [NIST P-192, X9.62 prime192v1]", "1.2.840.10045.3.1.1", PD, + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF", + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC", + "64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1", + "188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012", + "07192B95FFC8DA78631011ED6B24CDD573F977A11E794811", + "FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831", + 1, nameSplitPattern); + + add("secp224k1", "1.3.132.0.32", P, + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFE56D", + "00000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000005", + "A1455B334DF099DF30FC28A169A467E9E47075A90F7E650EB6B7A45C", + "7E089FED7FBA344282CAFBD6F7E319F7C0B0BD59E2CA4BDB556D61A5", + "010000000000000000000000000001DCE8D2EC6184CAF0A971769FB1F7", + 1, nameSplitPattern); + + add("secp224r1 [NIST P-224]", "1.3.132.0.33", PD, + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001", + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE", + "B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4", + "B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21", + "BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34", + "FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D", + 1, nameSplitPattern); + + add("secp256k1", "1.3.132.0.10", P, + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000007", + "79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798", + "483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8", + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141", + 1, nameSplitPattern); + + add("secp256r1 [NIST P-256, X9.62 prime256v1]", "1.2.840.10045.3.1.7", PD, + "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", + "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", + "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", + "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296", + "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", + "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551", + 1, nameSplitPattern); + + add("secp384r1 [NIST P-384]", "1.3.132.0.34", PD, + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF", + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC", + "B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF", + "AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7", + "3617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F", + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973", + 1, nameSplitPattern); + + add("secp521r1 [NIST P-521]", "1.3.132.0.35", PD, + "01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", + "01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC", + "0051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00", + "00C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66", + "011839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650", + "01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409", + 1, nameSplitPattern); + + /* ANSI X9.62 prime curves */ + add("X9.62 prime192v2", "1.2.840.10045.3.1.2", P, + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF", + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC", + "CC22D6DFB95C6B25E49C0D6364A4E5980C393AA21668D953", + "EEA2BAE7E1497842F2DE7769CFE9C989C072AD696F48034A", + "6574D11D69B6EC7A672BB82A083DF2F2B0847DE970B2DE15", + "FFFFFFFFFFFFFFFFFFFFFFFE5FB1A724DC80418648D8DD31", + 1, nameSplitPattern); + + add("X9.62 prime192v3", "1.2.840.10045.3.1.3", P, + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF", + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC", + "22123DC2395A05CAA7423DAECCC94760A7D462256BD56916", + "7D29778100C65A1DA1783716588DCE2B8B4AEE8E228F1896", + "38A90F22637337334B49DCB66A6DC8F9978ACA7648A943B0", + "FFFFFFFFFFFFFFFFFFFFFFFF7A62D031C83F4294F640EC13", + 1, nameSplitPattern); + + add("X9.62 prime239v1", "1.2.840.10045.3.1.4", P, + "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF", + "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC", + "6B016C3BDCF18941D0D654921475CA71A9DB2FB27D1D37796185C2942C0A", + "0FFA963CDCA8816CCC33B8642BEDF905C3D358573D3F27FBBD3B3CB9AAAF", + "7DEBE8E4E90A5DAE6E4054CA530BA04654B36818CE226B39FCCB7B02F1AE", + "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFF9E5E9A9F5D9071FBD1522688909D0B", + 1, nameSplitPattern); + + add("X9.62 prime239v2", "1.2.840.10045.3.1.5", P, + "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF", + "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC", + "617FAB6832576CBBFED50D99F0249C3FEE58B94BA0038C7AE84C8C832F2C", + "38AF09D98727705120C921BB5E9E26296A3CDCF2F35757A0EAFD87B830E7", + "5B0125E4DBEA0EC7206DA0FC01D9B081329FB555DE6EF460237DFF8BE4BA", + "7FFFFFFFFFFFFFFFFFFFFFFF800000CFA7E8594377D414C03821BC582063", + 1, nameSplitPattern); + + add("X9.62 prime239v3", "1.2.840.10045.3.1.6", P, + "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF", + "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC", + "255705FA2A306654B1F4CB03D6A750A30C250102D4988717D9BA15AB6D3E", + "6768AE8E18BB92CFCF005C949AA2C6D94853D0E660BBF854B1C9505FE95A", + "1607E6898F390C06BC1D552BAD226F3B6FCFE48B6E818499AF18E3ED6CF3", + "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFF975DEB41B3A6057C3C432146526551", + 1, nameSplitPattern); + + /* SEC2 binary curves */ + add("sect113r1", "1.3.132.0.4", B, + "020000000000000000000000000201", + "003088250CA6E7C7FE649CE85820F7", + "00E8BEE4D3E2260744188BE0E9C723", + "009D73616F35F4AB1407D73562C10F", + "00A52830277958EE84D1315ED31886", + "0100000000000000D9CCEC8A39E56F", + 2, nameSplitPattern); + + add("sect113r2", "1.3.132.0.5", B, + "020000000000000000000000000201", + "00689918DBEC7E5A0DD6DFC0AA55C7", + "0095E9A9EC9B297BD4BF36E059184F", + "01A57A6A7B26CA5EF52FCDB8164797", + "00B3ADC94ED1FE674C06E695BABA1D", + "010000000000000108789B2496AF93", + 2, nameSplitPattern); + + add("sect131r1", "1.3.132.0.22", B, + "080000000000000000000000000000010D", + "07A11B09A76B562144418FF3FF8C2570B8", + "0217C05610884B63B9C6C7291678F9D341", + "0081BAF91FDF9833C40F9C181343638399", + "078C6E7EA38C001F73C8134B1B4EF9E150", + "0400000000000000023123953A9464B54D", + 2, nameSplitPattern); + + add("sect131r2", "1.3.132.0.23", B, + "080000000000000000000000000000010D", + "03E5A88919D7CAFCBF415F07C2176573B2", + "04B8266A46C55657AC734CE38F018F2192", + "0356DCD8F2F95031AD652D23951BB366A8", + "0648F06D867940A5366D9E265DE9EB240F", + "0400000000000000016954A233049BA98F", + 2, nameSplitPattern); + + add("sect163k1 [NIST K-163]", "1.3.132.0.1", BD, + "0800000000000000000000000000000000000000C9", + "000000000000000000000000000000000000000001", + "000000000000000000000000000000000000000001", + "02FE13C0537BBC11ACAA07D793DE4E6D5E5C94EEE8", + "0289070FB05D38FF58321F2E800536D538CCDAA3D9", + "04000000000000000000020108A2E0CC0D99F8A5EF", + 2, nameSplitPattern); + + add("sect163r1", "1.3.132.0.2", B, + "0800000000000000000000000000000000000000C9", + "07B6882CAAEFA84F9554FF8428BD88E246D2782AE2", + "0713612DCDDCB40AAB946BDA29CA91F73AF958AFD9", + "0369979697AB43897789566789567F787A7876A654", + "00435EDB42EFAFB2989D51FEFCE3C80988F41FF883", + "03FFFFFFFFFFFFFFFFFFFF48AAB689C29CA710279B", + 2, nameSplitPattern); + + add("sect163r2 [NIST B-163]", "1.3.132.0.15", BD, + "0800000000000000000000000000000000000000C9", + "000000000000000000000000000000000000000001", + "020A601907B8C953CA1481EB10512F78744A3205FD", + "03F0EBA16286A2D57EA0991168D4994637E8343E36", + "00D51FBC6C71A0094FA2CDD545B11C5C0C797324F1", + "040000000000000000000292FE77E70C12A4234C33", + 2, nameSplitPattern); + + add("sect193r1", "1.3.132.0.24", B, + "02000000000000000000000000000000000000000000008001", + "0017858FEB7A98975169E171F77B4087DE098AC8A911DF7B01", + "00FDFB49BFE6C3A89FACADAA7A1E5BBC7CC1C2E5D831478814", + "01F481BC5F0FF84A74AD6CDF6FDEF4BF6179625372D8C0C5E1", + "0025E399F2903712CCF3EA9E3A1AD17FB0B3201B6AF7CE1B05", + "01000000000000000000000000C7F34A778F443ACC920EBA49", + 2, nameSplitPattern); + + add("sect193r2", "1.3.132.0.25", B, + "02000000000000000000000000000000000000000000008001", + "0163F35A5137C2CE3EA6ED8667190B0BC43ECD69977702709B", + "00C9BB9E8927D4D64C377E2AB2856A5B16E3EFB7F61D4316AE", + "00D9B67D192E0367C803F39E1A7E82CA14A651350AAE617E8F", + "01CE94335607C304AC29E7DEFBD9CA01F596F927224CDECF6C", + "010000000000000000000000015AAB561B005413CCD4EE99D5", + 2, nameSplitPattern); + + add("sect233k1 [NIST K-233]", "1.3.132.0.26", BD, + "020000000000000000000000000000000000000004000000000000000001", + "000000000000000000000000000000000000000000000000000000000000", + "000000000000000000000000000000000000000000000000000000000001", + "017232BA853A7E731AF129F22FF4149563A419C26BF50A4C9D6EEFAD6126", + "01DB537DECE819B7F70F555A67C427A8CD9BF18AEB9B56E0C11056FAE6A3", + "008000000000000000000000000000069D5BB915BCD46EFB1AD5F173ABDF", + 4, nameSplitPattern); + + add("sect233r1 [NIST B-233]", "1.3.132.0.27", B, + "020000000000000000000000000000000000000004000000000000000001", + "000000000000000000000000000000000000000000000000000000000001", + "0066647EDE6C332C7F8C0923BB58213B333B20E9CE4281FE115F7D8F90AD", + "00FAC9DFCBAC8313BB2139F1BB755FEF65BC391F8B36F8F8EB7371FD558B", + "01006A08A41903350678E58528BEBF8A0BEFF867A7CA36716F7E01F81052", + "01000000000000000000000000000013E974E72F8A6922031D2603CFE0D7", + 2, nameSplitPattern); + + add("sect239k1", "1.3.132.0.3", B, + "800000000000000000004000000000000000000000000000000000000001", + "000000000000000000000000000000000000000000000000000000000000", + "000000000000000000000000000000000000000000000000000000000001", + "29A0B6A887A983E9730988A68727A8B2D126C44CC2CC7B2A6555193035DC", + "76310804F12E549BDB011C103089E73510ACB275FC312A5DC6B76553F0CA", + "2000000000000000000000000000005A79FEC67CB6E91F1C1DA800E478A5", + 4, nameSplitPattern); + + add("sect283k1 [NIST K-283]", "1.3.132.0.16", BD, + "0800000000000000000000000000000000000000000000000000000000000000000010A1", + "000000000000000000000000000000000000000000000000000000000000000000000000", + "000000000000000000000000000000000000000000000000000000000000000000000001", + "0503213F78CA44883F1A3B8162F188E553CD265F23C1567A16876913B0C2AC2458492836", + "01CCDA380F1C9E318D90F95D07E5426FE87E45C0E8184698E45962364E34116177DD2259", + "01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9AE2ED07577265DFF7F94451E061E163C61", + 4, nameSplitPattern); + + add("sect283r1 [NIST B-283]", "1.3.132.0.17", B, + "0800000000000000000000000000000000000000000000000000000000000000000010A1", + "000000000000000000000000000000000000000000000000000000000000000000000001", + "027B680AC8B8596DA5A4AF8A19A0303FCA97FD7645309FA2A581485AF6263E313B79A2F5", + "05F939258DB7DD90E1934F8C70B0DFEC2EED25B8557EAC9C80E2E198F8CDBECD86B12053", + "03676854FE24141CB98FE6D4B20D02B4516FF702350EDDB0826779C813F0DF45BE8112F4", + "03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF90399660FC938A90165B042A7CEFADB307", + 2, nameSplitPattern); + + add("sect409k1 [NIST K-409]", "1.3.132.0.36", BD, + "02000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000001", + "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", + "0060F05F658F49C1AD3AB1890F7184210EFD0987E307C84C27ACCFB8F9F67CC2C460189EB5AAAA62EE222EB1B35540CFE9023746", + "01E369050B7C4E42ACBA1DACBF04299C3460782F918EA427E6325165E9EA10E3DA5F6C42E9C55215AA9CA27A5863EC48D8E0286B", + "007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5F83B2D4EA20400EC4557D5ED3E3E7CA5B4B5C83B8E01E5FCF", + 4, nameSplitPattern); + + add("sect409r1 [NIST B-409]", "1.3.132.0.37", B, + "02000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000001", + "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", + "0021A5C2C8EE9FEB5C4B9A753B7B476B7FD6422EF1F3DD674761FA99D6AC27C8A9A197B272822F6CD57A55AA4F50AE317B13545F", + "015D4860D088DDB3496B0C6064756260441CDE4AF1771D4DB01FFE5B34E59703DC255A868A1180515603AEAB60794E54BB7996A7", + "0061B1CFAB6BE5F32BBFA78324ED106A7636B9C5A7BD198D0158AA4F5488D08F38514F1FDF4B4F40D2181B3681C364BA0273C706", + "010000000000000000000000000000000000000000000000000001E2AAD6A612F33307BE5FA47C3C9E052F838164CD37D9A21173", + 2, nameSplitPattern); + + add("sect571k1 [NIST K-571]", "1.3.132.0.38", BD, + "080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000425", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", + "026EB7A859923FBC82189631F8103FE4AC9CA2970012D5D46024804801841CA44370958493B205E647DA304DB4CEB08CBBD1BA39494776FB988B47174DCA88C7E2945283A01C8972", + "0349DC807F4FBF374F4AEADE3BCA95314DD58CEC9F307A54FFC61EFC006D8A2C9D4979C0AC44AEA74FBEBBB9F772AEDCB620B01A7BA7AF1B320430C8591984F601CD4C143EF1C7A3", + "020000000000000000000000000000000000000000000000000000000000000000000000131850E1F19A63E4B391A8DB917F4138B630D84BE5D639381E91DEB45CFE778F637C1001", + 4, nameSplitPattern); + + add("sect571r1 [NIST B-571]", "1.3.132.0.39", B, + "080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000425", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", + "02F40E7E2221F295DE297117B7F3D62F5C6A97FFCB8CEFF1CD6BA8CE4A9A18AD84FFABBD8EFA59332BE7AD6756A66E294AFD185A78FF12AA520E4DE739BACA0C7FFEFF7F2955727A", + "0303001D34B856296C16C0D40D3CD7750A93D1D2955FA80AA5F40FC8DB7B2ABDBDE53950F4C0D293CDD711A35B67FB1499AE60038614F1394ABFA3B4C850D927E1E7769C8EEC2D19", + "037BF27342DA639B6DCCFFFEB73D69D78C6C27A6009CBBCA1980F8533921E8A684423E43BAB08A576291AF8F461BB2A8B3531D2F0485C19B16E2F1516E23DD3C1A4827AF1B8AC15B", + "03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE661CE18FF55987308059B186823851EC7DD9CA1161DE93D5174D66E8382E9BB2FE84E47", + 2, nameSplitPattern); + + /* ANSI X9.62 binary curves */ + add("X9.62 c2tnb191v1", "1.2.840.10045.3.0.5", B, + "800000000000000000000000000000000000000000000201", + "2866537B676752636A68F56554E12640276B649EF7526267", + "2E45EF571F00786F67B0081B9495A3D95462F5DE0AA185EC", + "36B3DAF8A23206F9C4F299D7B21A9C369137F2C84AE1AA0D", + "765BE73433B3F95E332932E70EA245CA2418EA0EF98018FB", + "40000000000000000000000004A20E90C39067C893BBB9A5", + 2, nameSplitPattern); + + add("X9.62 c2tnb191v2", "1.2.840.10045.3.0.6", B, + "800000000000000000000000000000000000000000000201", + "401028774D7777C7B7666D1366EA432071274F89FF01E718", + "0620048D28BCBD03B6249C99182B7C8CD19700C362C46A01", + "3809B2B7CC1B28CC5A87926AAD83FD28789E81E2C9E3BF10", + "17434386626D14F3DBF01760D9213A3E1CF37AEC437D668A", + "20000000000000000000000050508CB89F652824E06B8173", + 4, nameSplitPattern); + + add("X9.62 c2tnb191v3", "1.2.840.10045.3.0.7", B, + "800000000000000000000000000000000000000000000201", + "6C01074756099122221056911C77D77E77A777E7E7E77FCB", + "71FE1AF926CF847989EFEF8DB459F66394D90F32AD3F15E8", + "375D4CE24FDE434489DE8746E71786015009E66E38A926DD", + "545A39176196575D985999366E6AD34CE0A77CD7127B06BE", + "155555555555555555555555610C0B196812BFB6288A3EA3", + 6, nameSplitPattern); + + add("X9.62 c2tnb239v1", "1.2.840.10045.3.0.11", B, + "800000000000000000000000000000000000000000000000001000000001", + "32010857077C5431123A46B808906756F543423E8D27877578125778AC76", + "790408F2EEDAF392B012EDEFB3392F30F4327C0CA3F31FC383C422AA8C16", + "57927098FA932E7C0A96D3FD5B706EF7E5F5C156E16B7E7C86038552E91D", + "61D8EE5077C33FECF6F1A16B268DE469C3C7744EA9A971649FC7A9616305", + "2000000000000000000000000000000F4D42FFE1492A4993F1CAD666E447", + 4, nameSplitPattern); + + add("X9.62 c2tnb239v2", "1.2.840.10045.3.0.12", B, + "800000000000000000000000000000000000000000000000001000000001", + "4230017757A767FAE42398569B746325D45313AF0766266479B75654E65F", + "5037EA654196CFF0CD82B2C14A2FCF2E3FF8775285B545722F03EACDB74B", + "28F9D04E900069C8DC47A08534FE76D2B900B7D7EF31F5709F200C4CA205", + "5667334C45AFF3B5A03BAD9DD75E2C71A99362567D5453F7FA6E227EC833", + "1555555555555555555555555555553C6F2885259C31E3FCDF154624522D", + 6, nameSplitPattern); + + add("X9.62 c2tnb239v3", "1.2.840.10045.3.0.13", B, + "800000000000000000000000000000000000000000000000001000000001", + "01238774666A67766D6676F778E676B66999176666E687666D8766C66A9F", + "6A941977BA9F6A435199ACFC51067ED587F519C5ECB541B8E44111DE1D40", + "70F6E9D04D289C4E89913CE3530BFDE903977D42B146D539BF1BDE4E9C92", + "2E5A0EAF6E5E1305B9004DCE5C0ED7FE59A35608F33837C816D80B79F461", + "0CCCCCCCCCCCCCCCCCCCCCCCCCCCCCAC4912D2D9DF903EF9888B8A0E4CFF", + 0xA, nameSplitPattern); + + add("X9.62 c2tnb359v1", "1.2.840.10045.3.0.18", B, + "800000000000000000000000000000000000000000000000000000000000000000000000100000000000000001", + "5667676A654B20754F356EA92017D946567C46675556F19556A04616B567D223A5E05656FB549016A96656A557", + "2472E2D0197C49363F1FE7F5B6DB075D52B6947D135D8CA445805D39BC345626089687742B6329E70680231988", + "3C258EF3047767E7EDE0F1FDAA79DAEE3841366A132E163ACED4ED2401DF9C6BDCDE98E8E707C07A2239B1B097", + "53D7E08529547048121E9C95F3791DD804963948F34FAE7BF44EA82365DC7868FE57E4AE2DE211305A407104BD", + "01AF286BCA1AF286BCA1AF286BCA1AF286BCA1AF286BC9FB8F6B85C556892C20A7EB964FE7719E74F490758D3B", + 0x4C, nameSplitPattern); + + add("X9.62 c2tnb431r1", "1.2.840.10045.3.0.20", B, + "800000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000001", + "1A827EF00DD6FC0E234CAF046C6A5D8A85395B236CC4AD2CF32A0CADBDC9DDF620B0EB9906D0957F6C6FEACD615468DF104DE296CD8F", + "10D9B4A3D9047D8B154359ABFB1B7F5485B04CEB868237DDC9DEDA982A679A5A919B626D4E50A8DD731B107A9962381FB5D807BF2618", + "120FC05D3C67A99DE161D2F4092622FECA701BE4F50F4758714E8A87BBF2A658EF8C21E7C5EFE965361F6C2999C0C247B0DBD70CE6B7", + "20D0AF8903A96F8D5FA2C255745D3C451B302C9346D9B7E485E7BCE41F6B591F3E8F6ADDCBB0BC4C2F947A7DE1A89B625D6A598B3760", + "0340340340340340340340340340340340340340340340340340340323C313FAB50589703B5EC68D3587FEC60D161CC149C1AD4A91", + 0x2760, nameSplitPattern); + + /* ANSI X9.62 binary curves from the 1998 standard but forbidden + * in the 2005 version of the standard. + * We don't register them but leave them here for the time being in + * case we need to support them after all. + */ +/* + add("X9.62 c2pnb163v1", "1.2.840.10045.3.0.1", B, + "080000000000000000000000000000000000000107", + "072546B5435234A422E0789675F432C89435DE5242", + "00C9517D06D5240D3CFF38C74B20B6CD4D6F9DD4D9", + "07AF69989546103D79329FCC3D74880F33BBE803CB", + "01EC23211B5966ADEA1D3F87F7EA5848AEF0B7CA9F", + "0400000000000000000001E60FC8821CC74DAEAFC1", + 2, nameSplitPattern); + + add("X9.62 c2pnb163v2", "1.2.840.10045.3.0.2", B, + "080000000000000000000000000000000000000107", + "0108B39E77C4B108BED981ED0E890E117C511CF072", + "0667ACEB38AF4E488C407433FFAE4F1C811638DF20", + "0024266E4EB5106D0A964D92C4860E2671DB9B6CC5", + "079F684DDF6684C5CD258B3890021B2386DFD19FC5", + "03FFFFFFFFFFFFFFFFFFFDF64DE1151ADBB78F10A7", + 2, nameSplitPattern); + + add("X9.62 c2pnb163v3", "1.2.840.10045.3.0.3", B, + "080000000000000000000000000000000000000107", + "07A526C63D3E25A256A007699F5447E32AE456B50E", + "03F7061798EB99E238FD6F1BF95B48FEEB4854252B", + "02F9F87B7C574D0BDECF8A22E6524775F98CDEBDCB", + "05B935590C155E17EA48EB3FF3718B893DF59A05D0", + "03FFFFFFFFFFFFFFFFFFFE1AEE140F110AFF961309", + 2, nameSplitPattern); + + add("X9.62 c2pnb176w1", "1.2.840.10045.3.0.4", B, + "0100000000000000000000000000000000080000000007", + "E4E6DB2995065C407D9D39B8D0967B96704BA8E9C90B", + "5DDA470ABE6414DE8EC133AE28E9BBD7FCEC0AE0FFF2", + "8D16C2866798B600F9F08BB4A8E860F3298CE04A5798", + "6FA4539C2DADDDD6BAB5167D61B436E1D92BB16A562C", + "00010092537397ECA4F6145799D62B0A19CE06FE26AD", + 0xFF6E, nameSplitPattern); + + add("X9.62 c2pnb208w1", "1.2.840.10045.3.0.10", B, + "010000000000000000000000000000000800000000000000000007", + "0000000000000000000000000000000000000000000000000000", + "C8619ED45A62E6212E1160349E2BFA844439FAFC2A3FD1638F9E", + "89FDFBE4ABE193DF9559ECF07AC0CE78554E2784EB8C1ED1A57A", + "0F55B51A06E78E9AC38A035FF520D8B01781BEB1A6BB08617DE3", + "000101BAF95C9723C57B6C21DA2EFF2D5ED588BDD5717E212F9D", + 0xFE48, nameSplitPattern); + + add("X9.62 c2pnb272w1", "1.2.840.10045.3.0.16", B, + "010000000000000000000000000000000000000000000000000000010000000000000B", + "91A091F03B5FBA4AB2CCF49C4EDD220FB028712D42BE752B2C40094DBACDB586FB20", + "7167EFC92BB2E3CE7C8AAAFF34E12A9C557003D7C73A6FAF003F99F6CC8482E540F7", + "6108BABB2CEEBCF787058A056CBE0CFE622D7723A289E08A07AE13EF0D10D171DD8D", + "10C7695716851EEF6BA7F6872E6142FBD241B830FF5EFCACECCAB05E02005DDE9D23", + "000100FAF51354E0E39E4892DF6E319C72C8161603FA45AA7B998A167B8F1E629521", + 0xFF06, nameSplitPattern); + + add("X9.62 c2pnb304w1", "1.2.840.10045.3.0.17", B, + "010000000000000000000000000000000000000000000000000000000000000000000000000807", + "FD0D693149A118F651E6DCE6802085377E5F882D1B510B44160074C1288078365A0396C8E681", + "BDDB97E555A50A908E43B01C798EA5DAA6788F1EA2794EFCF57166B8C14039601E55827340BE", + "197B07845E9BE2D96ADB0F5F3C7F2CFFBD7A3EB8B6FEC35C7FD67F26DDF6285A644F740A2614", + "E19FBEB76E0DA171517ECF401B50289BF014103288527A9B416A105E80260B549FDC1B92C03B", + "000101D556572AABAC800101D556572AABAC8001022D5C91DD173F8FB561DA6899164443051D", + 0xFE2E, nameSplitPattern); + + add("X9.62 c2pnb368w1", "1.2.840.10045.3.0.19", B, + "0100000000000000000000000000000000000000000000000000000000000000000000002000000000000000000007", + "E0D2EE25095206F5E2A4F9ED229F1F256E79A0E2B455970D8D0D865BD94778C576D62F0AB7519CCD2A1A906AE30D", + "FC1217D4320A90452C760A58EDCD30C8DD069B3C34453837A34ED50CB54917E1C2112D84D164F444F8F74786046A", + "1085E2755381DCCCE3C1557AFA10C2F0C0C2825646C5B34A394CBCFA8BC16B22E7E789E927BE216F02E1FB136A5F", + "7B3EB1BDDCBA62D5D8B2059B525797FC73822C59059C623A45FF3843CEE8F87CD1855ADAA81E2A0750B80FDA2310", + "00010090512DA9AF72B08349D98A5DD4C7B0532ECA51CE03E2D10F3B7AC579BD87E909AE40A6F131E9CFCE5BD967", + 0xFF70, nameSplitPattern); +*/ + + specCollection = Collections.unmodifiableCollection(oidMap.values()); + } +} diff -r d553e7400295 -r 6c9ff31edda0 jdk/src/share/classes/sun/security/util/ECParameters.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/sun/security/util/ECParameters.java Wed Jul 05 19:52:15 2017 +0200 @@ -0,0 +1,236 @@ +/* + * Copyright (c) 2006, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.security.util; + +import java.io.IOException; + +import java.security.*; +import java.security.spec.*; + +/** + * This class implements encoding and decoding of Elliptic Curve parameters + * as specified in RFC 3279. + * + * However, only named curves are currently supported. + * + * ASN.1 from RFC 3279 follows. Note that X9.62 (2005) has added some additional + * options. + * + *
    + *    EcpkParameters ::= CHOICE {
    + *      ecParameters  ECParameters,
    + *      namedCurve    OBJECT IDENTIFIER,
    + *      implicitlyCA  NULL }
    + *
    + *    ECParameters ::= SEQUENCE {
    + *       version   ECPVer,          -- version is always 1
    + *       fieldID   FieldID,         -- identifies the finite field over
    + *                                  -- which the curve is defined
    + *       curve     Curve,           -- coefficients a and b of the
    + *                                  -- elliptic curve
    + *       base      ECPoint,         -- specifies the base point P
    + *                                  -- on the elliptic curve
    + *       order     INTEGER,         -- the order n of the base point
    + *       cofactor  INTEGER OPTIONAL -- The integer h = #E(Fq)/n
    + *       }
    + *
    + *    ECPVer ::= INTEGER {ecpVer1(1)}
    + *
    + *    Curve ::= SEQUENCE {
    + *       a         FieldElement,
    + *       b         FieldElement,
    + *       seed      BIT STRING OPTIONAL }
    + *
    + *    FieldElement ::= OCTET STRING
    + *
    + *    ECPoint ::= OCTET STRING
    + * 
    + * + * @since 1.6 + * @author Andreas Sterbenz + */ +public final class ECParameters extends AlgorithmParametersSpi { + + // used by ECPublicKeyImpl and ECPrivateKeyImpl + public static AlgorithmParameters getAlgorithmParameters(ECParameterSpec spec) + throws InvalidKeyException { + try { + AlgorithmParameters params = + AlgorithmParameters.getInstance("EC", "SunEC"); + params.init(spec); + return params; + } catch (GeneralSecurityException e) { + throw new InvalidKeyException("EC parameters error", e); + } + } + + /* + * The parameters these AlgorithmParameters object represents. + * Currently, it is always an instance of NamedCurve. + */ + private NamedCurve namedCurve; + + // A public constructor is required by AlgorithmParameters class. + public ECParameters() { + // empty + } + + // AlgorithmParameterSpi methods + + protected void engineInit(AlgorithmParameterSpec paramSpec) + throws InvalidParameterSpecException { + + if (paramSpec == null) { + throw new InvalidParameterSpecException + ("paramSpec must not be null"); + } + + if (paramSpec instanceof NamedCurve) { + namedCurve = (NamedCurve)paramSpec; + return; + } + + if (paramSpec instanceof ECParameterSpec) { + namedCurve = CurveDB.lookup((ECParameterSpec)paramSpec); + } else if (paramSpec instanceof ECGenParameterSpec) { + String name = ((ECGenParameterSpec)paramSpec).getName(); + namedCurve = CurveDB.lookup(name); + } else if (paramSpec instanceof ECKeySizeParameterSpec) { + int keySize = ((ECKeySizeParameterSpec)paramSpec).getKeySize(); + namedCurve = CurveDB.lookup(keySize); + } else { + throw new InvalidParameterSpecException + ("Only ECParameterSpec and ECGenParameterSpec supported"); + } + + if (namedCurve == null) { + throw new InvalidParameterSpecException( + "Not a supported curve: " + paramSpec); + } + } + + protected void engineInit(byte[] params) throws IOException { + DerValue encodedParams = new DerValue(params); + if (encodedParams.tag == DerValue.tag_ObjectId) { + ObjectIdentifier oid = encodedParams.getOID(); + NamedCurve spec = CurveDB.lookup(oid.toString()); + if (spec == null) { + throw new IOException("Unknown named curve: " + oid); + } + + namedCurve = spec; + return; + } + + throw new IOException("Only named ECParameters supported"); + + // The code below is incomplete. + // It is left as a starting point for a complete parsing implementation. + +/* + if (encodedParams.tag != DerValue.tag_Sequence) { + throw new IOException("Unsupported EC parameters, tag: " + + encodedParams.tag); + } + + encodedParams.data.reset(); + + DerInputStream in = encodedParams.data; + + int version = in.getInteger(); + if (version != 1) { + throw new IOException("Unsupported EC parameters version: " + + version); + } + ECField field = parseField(in); + EllipticCurve curve = parseCurve(in, field); + ECPoint point = parsePoint(in, curve); + + BigInteger order = in.getBigInteger(); + int cofactor = 0; + + if (in.available() != 0) { + cofactor = in.getInteger(); + } + + // XXX HashAlgorithm optional + + if (encodedParams.data.available() != 0) { + throw new IOException("encoded params have " + + encodedParams.data.available() + + " extra bytes"); + } + + return new ECParameterSpec(curve, point, order, cofactor); +*/ + } + + protected void engineInit(byte[] params, String decodingMethod) + throws IOException { + engineInit(params); + } + + protected T + engineGetParameterSpec(Class spec) + throws InvalidParameterSpecException { + + if (spec.isAssignableFrom(ECParameterSpec.class)) { + return spec.cast(namedCurve); + } + + if (spec.isAssignableFrom(ECGenParameterSpec.class)) { + // Ensure the name is the Object ID + String name = namedCurve.getObjectId(); + return spec.cast(new ECGenParameterSpec(name)); + } + + if (spec.isAssignableFrom(ECKeySizeParameterSpec.class)) { + int keySize = namedCurve.getCurve().getField().getFieldSize(); + return spec.cast(new ECKeySizeParameterSpec(keySize)); + } + + throw new InvalidParameterSpecException( + "Only ECParameterSpec and ECGenParameterSpec supported"); + } + + protected byte[] engineGetEncoded() throws IOException { + return namedCurve.getEncoded(); + } + + protected byte[] engineGetEncoded(String encodingMethod) + throws IOException { + return engineGetEncoded(); + } + + protected String engineToString() { + if (namedCurve == null) { + return "Not initialized"; + } + + return namedCurve.toString(); + } +} + diff -r d553e7400295 -r 6c9ff31edda0 jdk/src/share/classes/sun/security/util/NamedCurve.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/sun/security/util/NamedCurve.java Wed Jul 05 19:52:15 2017 +0200 @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2006, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.security.util; + +import java.io.IOException; +import java.math.BigInteger; + +import java.security.spec.*; + + +/** + * Contains Elliptic Curve parameters. + * + * @since 1.6 + * @author Andreas Sterbenz + */ +public final class NamedCurve extends ECParameterSpec { + + // friendly name for toString() output + private final String name; + + // well known OID + private final String oid; + + // encoded form (as NamedCurve identified via OID) + private final byte[] encoded; + + NamedCurve(String name, String oid, EllipticCurve curve, + ECPoint g, BigInteger n, int h) { + super(curve, g, n, h); + this.name = name; + this.oid = oid; + + DerOutputStream out = new DerOutputStream(); + + try { + out.putOID(new ObjectIdentifier(oid)); + } catch (IOException e) { + throw new RuntimeException("Internal error", e); + } + + encoded = out.toByteArray(); + } + + public String getName() { + return name; + } + + public byte[] getEncoded() { + return encoded.clone(); + } + + public String getObjectId() { + return oid; + } + + public String toString() { + return name + " (" + oid + ")"; + } +} diff -r d553e7400295 -r 6c9ff31edda0 jdk/src/windows/native/sun/tools/attach/WindowsVirtualMachine.c --- a/jdk/src/windows/native/sun/tools/attach/WindowsVirtualMachine.c Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/src/windows/native/sun/tools/attach/WindowsVirtualMachine.c Wed Jul 05 19:52:15 2017 +0200 @@ -388,6 +388,7 @@ if (argsLen > 0) { if (argsLen > MAX_ARGS) { JNU_ThrowInternalError(env, "Too many arguments"); + return; } for (i=0; iGetObjectArrayElement(env, args, i); @@ -423,6 +424,8 @@ stubLen = (DWORD)(*env)->GetArrayLength(env, stub); stubCode = (*env)->GetByteArrayElements(env, stub, &isCopy); + if ((*env)->ExceptionOccurred(env)) return; + pCode = (PDWORD) VirtualAllocEx( hProcess, 0, stubLen, MEM_COMMIT, PAGE_EXECUTE_READWRITE ); if (pCode == NULL) { JNU_ThrowIOExceptionWithLastError(env, "VirtualAllocEx failed"); @@ -592,6 +595,8 @@ cstr[0] = '\0'; } else { str = JNU_GetStringPlatformChars(env, jstr, &isCopy); + if ((*env)->ExceptionOccurred(env)) return; + strncpy(cstr, str, len); cstr[len-1] = '\0'; if (isCopy) { diff -r d553e7400295 -r 6c9ff31edda0 jdk/test/java/lang/Integer/ParsingTest.java --- a/jdk/test/java/lang/Integer/ParsingTest.java Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/test/java/lang/Integer/ParsingTest.java Wed Jul 05 19:52:15 2017 +0200 @@ -23,29 +23,37 @@ /* * @test - * @bug 5017980 6576055 + * @bug 5017980 6576055 8041972 * @summary Test parsing methods * @author Joseph D. Darcy */ +import java.lang.IllegalArgumentException; +import java.lang.IndexOutOfBoundsException; +import java.lang.NullPointerException; +import java.lang.RuntimeException; /** - * There are six methods in java.lang.Integer which transform strings + * There are eight methods in java.lang.Integer which transform strings * into an int or Integer value: * * public Integer(String s) * public static Integer decode(String nm) + * public static int parseInt(CharSequence s, int radix, int beginIndex, int endIndex) + * public static int parseInt(CharSequence s, int radix, int beginIndex) * public static int parseInt(String s, int radix) * public static int parseInt(String s) * public static Integer valueOf(String s, int radix) * public static Integer valueOf(String s) * * Besides decode, all the methods and constructor call down into - * parseInt(String, int) to do the actual work. Therefore, the - * behavior of parseInt(String, int) will be tested here. + * parseInt(CharSequence, int, int, int) to do the actual work. Therefore, the + * behavior of parseInt(CharSequence, int, int, int) will be tested here. + * */ public class ParsingTest { + public static void main(String... argv) { check("+100", +100); check("-100", -100); @@ -55,10 +63,14 @@ check("+00000", 0); check("-00000", 0); + check("+00000", 0, 0, 6); + check("-00000", 0, 0, 6); + check("0", 0); check("1", 1); check("9", 9); + checkFailure(""); checkFailure("\u0000"); checkFailure("\u002f"); checkFailure("+"); @@ -72,12 +84,45 @@ checkFailure("+-6"); checkFailure("-+6"); checkFailure("*100"); + + check("test-00000", 0, 4, 10); + check("test-12345", -12345, 4, 10); + check("xx12345yy", 12345, 2, 7); + + checkNumberFormatException("", 10, 0); + checkNumberFormatException("100", 10, 3); + checkNumberFormatException("+1000000", 10, 8); + checkNumberFormatException("-1000000", 10, 8); + + checkNumberFormatException("", 10, 0, 0); + checkNumberFormatException("+-6", 10, 0, 3); + checkNumberFormatException("1000000", 10, 7); + checkNumberFormatException("1000000", 10, 7, 7); + checkNumberFormatException("1000000", Character.MAX_RADIX + 1, 0, 2); + checkNumberFormatException("1000000", Character.MIN_RADIX - 1, 0, 2); + + checkIndexOutOfBoundsException("1000000", 10, 8); + checkIndexOutOfBoundsException("1000000", 10, -1); + checkIndexOutOfBoundsException("1000000", 10, 10, 4); + checkIndexOutOfBoundsException("1000000", Character.MAX_RADIX + 1, -1, 2); + checkIndexOutOfBoundsException("1000000", Character.MIN_RADIX - 1, -1, 2); + checkIndexOutOfBoundsException("1000000", Character.MAX_RADIX + 1, 10, 2); + checkIndexOutOfBoundsException("1000000", Character.MIN_RADIX - 1, 10, 2); + checkIndexOutOfBoundsException("-1", 10, 0, 3); + checkIndexOutOfBoundsException("-1", 10, 2, 3); + checkIndexOutOfBoundsException("-1", 10, -1, 2); + + checkNull(10, 0, 1); + checkNull(10, -1, 0); + checkNull(10, 0, 0); + checkNull(10, 0, -1); + checkNull(-1, -1, -1); } private static void check(String val, int expected) { int n = Integer.parseInt(val); if (n != expected) - throw new RuntimeException("Integer.parsedInt failed. String:" + + throw new RuntimeException("Integer.parseInt failed. String:" + val + " Result:" + n); } @@ -91,4 +136,71 @@ ; // Expected } } + + private static void checkNumberFormatException(String val, int radix, int start) { + int n = 0; + try { + n = Integer.parseInt(val, radix, start); + System.err.println("parseInt(" + val + ", " + radix + ", " + start + + ") incorrectly returned " + n); + throw new RuntimeException(); + } catch (NumberFormatException nfe) { + ; // Expected + } + } + + private static void checkNumberFormatException(String val, int radix, int start, int end) { + int n = 0; + try { + n = Integer.parseInt(val, radix, start, end); + System.err.println("parseInt(" + val + ", " + radix + ", " + start + ", " + end + + ") incorrectly returned " + n); + throw new RuntimeException(); + } catch (NumberFormatException nfe) { + ; // Expected + } + } + + private static void checkIndexOutOfBoundsException(String val, int radix, int start) { + int n = 0; + try { + n = Integer.parseInt(val, radix, start); + System.err.println("parseInt(" + val + ", " + radix + ", " + start + + ") incorrectly returned " + n); + throw new RuntimeException(); + } catch (IndexOutOfBoundsException ioob) { + ; // Expected + } + } + + private static void checkIndexOutOfBoundsException(String val, int radix, int start, int end) { + int n = 0; + try { + n = Integer.parseInt(val, radix, start, end); + System.err.println("parseInt(" + val + ", " + radix + ", " + start + ", " + end + + ") incorrectly returned " + n); + throw new RuntimeException(); + } catch (IndexOutOfBoundsException ioob) { + ; // Expected + } + } + + private static void checkNull(int radix, int start, int end) { + int n = 0; + try { + n = Integer.parseInt(null, 10, start, end); + System.err.println("parseInt(null, " + radix + ", " + start + ", " + end + + ") incorrectly returned " + n); + throw new RuntimeException(); + } catch (NullPointerException npe) { + ; // Expected + } + } + + private static void check(String val, int expected, int start, int end) { + int n = Integer.parseInt(val, 10, start, end); + if (n != expected) + throw new RuntimeException("Integer.parsedInt failed. String:" + + val + ", start: " + start + ", end: " + end + " Result:" + n); + } } diff -r d553e7400295 -r 6c9ff31edda0 jdk/test/java/lang/Long/ParsingTest.java --- a/jdk/test/java/lang/Long/ParsingTest.java Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/test/java/lang/Long/ParsingTest.java Wed Jul 05 19:52:15 2017 +0200 @@ -23,29 +23,31 @@ /* * @test - * @bug 5017980 6576055 + * @bug 5017980 6576055 8041972 * @summary Test parsing methods * @author Joseph D. Darcy */ - /** - * There are six methods in java.lang.Long which transform strings + * There are eight methods in java.lang.Long which transform strings * into a long or Long value: * * public Long(String s) * public static Long decode(String nm) + * public static long parseLong(CharSequence s, int radix, int beginIndex, int endIndex) + * public static long parseLong(CharSequence s, int radix, int beginIndex) * public static long parseLong(String s, int radix) * public static long parseLong(String s) * public static Long valueOf(String s, int radix) * public static Long valueOf(String s) * * Besides decode, all the methods and constructor call down into - * parseLong(String, int) to do the actual work. Therefore, the - * behavior of parseLong(String, int) will be tested here. + * parseLong(CharSequence, int, int, int) to do the actual work. Therefore, the + * behavior of parseLong(CharSequence, int, int, int) will be tested here. */ public class ParsingTest { + public static void main(String... argv) { check("+100", +100L); check("-100", -100L); @@ -59,6 +61,7 @@ check("1", 1L); check("9", 9L); + checkFailure(""); checkFailure("\u0000"); checkFailure("\u002f"); checkFailure("+"); @@ -72,12 +75,44 @@ checkFailure("+-6"); checkFailure("-+6"); checkFailure("*100"); + + check("test-00000", 0L, 4, 10); + check("test-12345", -12345L, 4, 10); + check("xx12345yy", 12345L, 2, 7); + check("xx123456789012345yy", 123456789012345L, 2, 17); + + checkNumberFormatException("100", 10, 3); + checkNumberFormatException("", 10, 0); + checkNumberFormatException("+1000000", 10, 8); + checkNumberFormatException("-1000000", 10, 8); + + checkNumberFormatException("", 10, 0, 0); + checkNumberFormatException("+-6", 10, 0, 3); + checkNumberFormatException("1000000", 10, 7, 7); + checkNumberFormatException("1000000", Character.MAX_RADIX + 1, 0, 2); + checkNumberFormatException("1000000", Character.MIN_RADIX - 1, 0, 2); + + checkIndexOutOfBoundsException("", 10, 1, 1); + checkIndexOutOfBoundsException("1000000", 10, 10, 4); + checkIndexOutOfBoundsException("1000000", Character.MAX_RADIX + 1, 10, 2); + checkIndexOutOfBoundsException("1000000", Character.MIN_RADIX - 1, 10, 2); + checkIndexOutOfBoundsException("1000000", Character.MAX_RADIX + 1, -1, 2); + checkIndexOutOfBoundsException("1000000", Character.MIN_RADIX - 1, -1, 2); + checkIndexOutOfBoundsException("-1", 10, 0, 3); + checkIndexOutOfBoundsException("-1", 10, 2, 3); + checkIndexOutOfBoundsException("-1", 10, -1, 2); + + checkNull(10, 0, 1); + checkNull(10, -1, 0); + checkNull(10, 0, 0); + checkNull(10, 0, -1); + checkNull(-1, -1, -1); } private static void check(String val, long expected) { long n = Long.parseLong(val); if (n != expected) - throw new RuntimeException("Long.parsedLong failed. String:" + + throw new RuntimeException("Long.parseLong failed. String:" + val + " Result:" + n); } @@ -91,4 +126,71 @@ ; // Expected } } + + private static void checkNumberFormatException(String val, int radix, int start) { + int n = 0; + try { + n = Integer.parseInt(val, radix, start); + System.err.println("parseInt(" + val + ", " + radix + ", " + start + + ") incorrectly returned " + n); + throw new RuntimeException(); + } catch (NumberFormatException nfe) { + ; // Expected + } + } + + private static void checkNumberFormatException(String val, int radix, int start, int end) { + long n = 0; + try { + n = Long.parseLong(val, radix, start, end); + System.err.println("parseInt(" + val + ", " + radix + ", " + start + ", " + end + + ") incorrectly returned " + n); + throw new RuntimeException(); + } catch (NumberFormatException nfe) { + ; // Expected + } + } + + private static void checkIndexOutOfBoundsException(String val, int radix, int start) { + int n = 0; + try { + n = Integer.parseInt(val, radix, start); + System.err.println("parseInt(" + val + ", " + radix + ", " + start + + ") incorrectly returned " + n); + throw new RuntimeException(); + } catch (IndexOutOfBoundsException ioob) { + ; // Expected + } + } + + private static void checkIndexOutOfBoundsException(String val, int radix, int start, int end) { + long n = 0; + try { + n = Long.parseLong(val, radix, start, end); + System.err.println("parseInt(" + val + ", " + radix + ", " + start + ", " + end + + ") incorrectly returned " + n); + throw new RuntimeException(); + } catch (IndexOutOfBoundsException ioob) { + ; // Expected + } + } + + private static void checkNull(int radix, int start, int end) { + long n = 0; + try { + n = Long.parseLong(null, 10, start, end); + System.err.println("parseInt(null, " + radix + ", " + start + ", " + end + + ") incorrectly returned " + n); + throw new RuntimeException(); + } catch (NullPointerException npe) { + ; // Expected + } + } + + private static void check(String val, long expected, int start, int end) { + long n = Long.parseLong(val, 10, start, end); + if (n != expected) + throw new RuntimeException("Long.parseLong failed. String:" + + val + ", start: " + start + ", end: " + end + " Result:" + n); + } } diff -r d553e7400295 -r 6c9ff31edda0 jdk/test/java/lang/String/ToLowerCase.java --- a/jdk/test/java/lang/String/ToLowerCase.java Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/test/java/lang/String/ToLowerCase.java Wed Jul 05 19:52:15 2017 +0200 @@ -23,7 +23,7 @@ /* @test - @bug 4217441 4533872 4900935 8020037 8032012 8041791 + @bug 4217441 4533872 4900935 8020037 8032012 8041791 8042589 @summary toLowerCase should lower-case Greek Sigma correctly depending on the context (final/non-final). Also it should handle Locale specific (lt, tr, and az) lowercasings and supplementary @@ -106,6 +106,12 @@ // invalid code point tests: test("\uD800\uD800\uD801A\uDC00\uDC00\uDC00B", Locale.US, "\uD800\uD800\uD801a\uDC00\uDC00\uDC00b"); + // lower/uppercase + surrogates + test("a\uD801\uDC1c", Locale.ROOT, "a\uD801\uDC44"); + test("A\uD801\uDC1c", Locale.ROOT, "a\uD801\uDC44"); + test("a\uD801\uDC00\uD801\uDC01\uD801\uDC02", Locale.US, "a\uD801\uDC28\uD801\uDC29\uD801\uDC2A"); + test("A\uD801\uDC00\uD801\uDC01\uD801\uDC02", Locale.US, "a\uD801\uDC28\uD801\uDC29\uD801\uDC2A"); + // test bmp + supp1 StringBuilder src = new StringBuilder(0x20000); StringBuilder exp = new StringBuilder(0x20000); diff -r d553e7400295 -r 6c9ff31edda0 jdk/test/java/lang/String/ToUpperCase.java --- a/jdk/test/java/lang/String/ToUpperCase.java Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/test/java/lang/String/ToUpperCase.java Wed Jul 05 19:52:15 2017 +0200 @@ -23,7 +23,7 @@ /* @test - @bug 4219630 4304573 4533872 4900935 + @bug 4219630 4304573 4533872 4900935 8042589 @summary toUpperCase should upper-case German sharp s correctly even if it's the only character in the string. should also uppercase all of the 1:M char mappings correctly. Also it should handle @@ -91,6 +91,12 @@ test("\uD801\uDC28a\uD801\uDC29b\uD801\uDC2Ac", Locale.US, "\uD801\uDC00A\uD801\uDC01B\uD801\uDC02C"); // invalid code point tests: test("\uD800\uD800\uD801a\uDC00\uDC00\uDC00b", Locale.US, "\uD800\uD800\uD801A\uDC00\uDC00\uDC00B"); + + // lower/uppercase + surrogates + test("a\uD801\uDC44", Locale.ROOT, "A\uD801\uDC1c"); + test("A\uD801\uDC44", Locale.ROOT, "A\uD801\uDC1c"); + test("a\uD801\uDC28\uD801\uDC29\uD801\uDC2A", Locale.US, "A\uD801\uDC00\uD801\uDC01\uD801\uDC02"); + test("A\uD801\uDC28a\uD801\uDC29b\uD801\uDC2Ac", Locale.US, "A\uD801\uDC00A\uD801\uDC01B\uD801\uDC02C"); } static void test(String in, Locale locale, String expected) { diff -r d553e7400295 -r 6c9ff31edda0 jdk/test/java/net/MulticastSocket/TestInterfaces.java --- a/jdk/test/java/net/MulticastSocket/TestInterfaces.java Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/test/java/net/MulticastSocket/TestInterfaces.java Wed Jul 05 19:52:15 2017 +0200 @@ -28,6 +28,8 @@ * same InetAddress set by MulticastSocket.setInterface */ import java.net.*; +import java.util.Arrays; +import java.util.Collections; import java.util.Enumeration; import java.io.IOException; @@ -47,6 +49,7 @@ /* * Test MulticastSocket.getInterface */ + System.out.println("Testing network interface " + ni); Enumeration addrs = ni.getInetAddresses(); while (addrs.hasMoreElements()) { InetAddress ia = (InetAddress)addrs.nextElement(); @@ -64,6 +67,8 @@ InetAddress curr = soc.getInterface(); if (!curr.equals(ia)) { + System.err.println("NetworkInterface under test " + ni); + displayInterfaceInformation(ni); System.err.println("MulticastSocket.getInterface returned: " + curr); System.err.println("Failed! Expected: " + ia); failures++; @@ -96,6 +101,10 @@ if (!curr.equals(ni)) { System.err.println("MulticastSocket.getNetworkInterface returned: " + curr); System.err.println("Failed! Expected: " + ni); + System.err.println("NetworkInterface details for curr variable "); + displayInterfaceInformation(curr); + System.err.println("NetworkInterface details for ni variable "); + displayInterfaceInformation(ni) ; failures++; } else { System.out.println("Passed."); @@ -110,4 +119,23 @@ } + static void displayInterfaceInformation(NetworkInterface netint) throws SocketException { + System.err.println("Display name: " + netint.getDisplayName()); + System.err.println("Name: " + netint.getName()); + Enumeration inetAddresses = netint.getInetAddresses(); + + for (InetAddress inetAddress : Collections.list(inetAddresses)) + System.err.println("InetAddress: " + inetAddress); + + System.err.println("Up? " + netint.isUp()); + System.err.println("Loopback? " + netint.isLoopback()); + System.err.println("PointToPoint? " + netint.isPointToPoint()); + System.err.println("Supports multicast? " + netint.supportsMulticast()); + System.err.println("Virtual? " + netint.isVirtual()); + System.err.println("Hardware address: " + + Arrays.toString(netint.getHardwareAddress())); + System.err.println("MTU: " + netint.getMTU()); + System.err.println("Index: " + netint.getIndex()); + System.err.println(); + } } diff -r d553e7400295 -r 6c9ff31edda0 jdk/test/java/util/UUID/UUIDTest.java --- a/jdk/test/java/util/UUID/UUIDTest.java Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/test/java/util/UUID/UUIDTest.java Wed Jul 05 19:52:15 2017 +0200 @@ -96,6 +96,23 @@ if (!u1.equals(u2)) throw new Exception("UUID -> string -> UUID failed"); } + + testFromStringError("-0"); + testFromStringError("x"); + testFromStringError("----"); + testFromStringError("-0-0-0-0"); + testFromStringError("0-0-0-0-"); + testFromStringError("0-0-0-0-0-"); + testFromStringError("0-0-0-0-x"); + } + + private static void testFromStringError(String str) { + try { + UUID test = UUID.fromString(str); + throw new RuntimeException("Should have thrown IAE"); + } catch (IllegalArgumentException iae) { + // pass + } } private static void versionTest() throws Exception { diff -r d553e7400295 -r 6c9ff31edda0 jdk/test/javax/security/auth/kerberos/KerberosHashEqualsTest.java --- a/jdk/test/javax/security/auth/kerberos/KerberosHashEqualsTest.java Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/test/javax/security/auth/kerberos/KerberosHashEqualsTest.java Wed Jul 05 19:52:15 2017 +0200 @@ -33,9 +33,7 @@ import java.net.InetAddress; import java.util.Date; -import javax.security.auth.kerberos.KerberosKey; -import javax.security.auth.kerberos.KerberosPrincipal; -import javax.security.auth.kerberos.KerberosTicket; +import javax.security.auth.kerberos.*; public class KerberosHashEqualsTest { public static void main(String[] args) throws Exception { @@ -66,28 +64,67 @@ k2.destroy(); checkNotSame(k1, k2); - - // destroyed keys doesn't equal to each other checkNotSame(k2, k1); checkSame(k2, k2); + k1.destroy(); + checkNotSame(k1, k2); + + // Destroyed key has string and hashCode + k1.toString(); k1.hashCode(); + // a little different + k1 = new KerberosKey(newKP("A"), "pass".getBytes(), 1, 1); k2 = new KerberosKey(newKP("B"), "pass".getBytes(), 1, 1); checkNotSame(k1, k2); + k2 = new KerberosKey(newKP("A"), "ssap".getBytes(), 1, 1); checkNotSame(k1, k2); + k2 = new KerberosKey(newKP("A"), "pass".getBytes(), 2, 1); checkNotSame(k1, k2); + k2 = new KerberosKey(newKP("A"), "pass".getBytes(), 1, 2); checkNotSame(k1, k2); + // Null k1 = new KerberosKey(null, "pass".getBytes(), 1, 2); checkNotSame(k1, k2); // null to non-null k2 = new KerberosKey(null, "pass".getBytes(), 1, 2); checkSame(k1, k2); // null to null + // Even key with null principal has a string and hashCode + k1.toString(); k1.hashCode(); + checkNotSame(k1, "Another Object"); + EncryptionKey e1, e2; + e1 = new EncryptionKey("pass".getBytes(), 1); + e2 = new EncryptionKey("pass".getBytes(), 1); + checkSame(e1, e1); // me to me + checkSame(e1, e2); // same + + e2.destroy(); + checkNotSame(e1, e2); + checkNotSame(e2, e1); + checkSame(e2, e2); + + e1.destroy(); + checkNotSame(e1, e2); + + // Destroyed key has string and hashCode + e1.toString(); e1.hashCode(); + + // a little different + e1 = new EncryptionKey("pass".getBytes(), 1); + e2 = new EncryptionKey("ssap".getBytes(), 1); + checkNotSame(e1, e2); + + e2 = new EncryptionKey("pass".getBytes(), 2); + checkNotSame(e1, e2); + + checkNotSame(e1, "Another Object"); + KerberosTicket t1, t2; t1 = new KerberosTicket("asn1".getBytes(), newKP("client"), newKP("server"), "pass".getBytes(), 1, new boolean[] {true, true}, new Date(0), new Date(0), new Date(0), new Date(0), null); t2 = new KerberosTicket("asn1".getBytes(), newKP("client"), newKP("server"), "pass".getBytes(), 1, new boolean[] {true, true}, new Date(0), new Date(0), new Date(0), new Date(0), null); @@ -120,6 +157,7 @@ t2.destroy(); checkNotSame(t1, t2); + t2.hashCode(); t2.toString(); // destroyed tickets doesn't equal to each other checkNotSame(t2, t1); @@ -130,6 +168,37 @@ checkNotSame(t1, t2); // renewtill is useful checkNotSame(t1, "Another Object"); + + KerberosCredMessage m1, m2; + m1 = new KerberosCredMessage(newKP("C"), newKP("S"), "message".getBytes()); + m2 = new KerberosCredMessage(newKP("C"), newKP("S"), "message".getBytes()); + checkSame(m1, m1); // me to me + checkSame(m1, m2); // same + + m2.destroy(); + checkNotSame(m1, m2); + checkNotSame(m2, m1); + checkSame(m2, m2); + + m1.destroy(); + checkNotSame(m1, m2); + + // Destroyed message has string and hashCode + m1.toString(); m1.hashCode(); + + // a little different + m1 = new KerberosCredMessage(newKP("C"), newKP("S"), "message".getBytes()); + m2 = new KerberosCredMessage(newKP("A"), newKP("S"), "message".getBytes()); + checkNotSame(m1, m2); + + m2 = new KerberosCredMessage(newKP("C"), newKP("B"), "message".getBytes()); + checkNotSame(m1, m2); + + m1 = new KerberosCredMessage(newKP("C"), newKP("S"), "hello".getBytes()); + checkNotSame(m1, m2); + + checkNotSame(m1, "Another Object"); + System.out.println("Good!"); } diff -r d553e7400295 -r 6c9ff31edda0 jdk/test/javax/security/auth/kerberos/KerberosNullsAndDestroyTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/security/auth/kerberos/KerberosNullsAndDestroyTest.java Wed Jul 05 19:52:15 2017 +0200 @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8043071 + * @summary Expose session key and KRB_CRED through extended GSS-API + */ + +import javax.security.auth.kerberos.*; +import java.util.function.Supplier; + +public class KerberosNullsAndDestroyTest { + + public static void main(String[] args) throws Exception { + + KerberosPrincipal c = new KerberosPrincipal("me@HERE"); + KerberosPrincipal s = new KerberosPrincipal("you@THERE"); + + // These object constructions should throw NullPointerException + checkNPE(() -> new KerberosKey(c, null, 17, 1)); + checkNPE(() -> new EncryptionKey(null, 17)); + checkNPE(() -> new KerberosCredMessage(null, s, new byte[1])); + checkNPE(() -> new KerberosCredMessage(c, null, new byte[1])); + checkNPE(() -> new KerberosCredMessage(c, s, null)); + + KerberosKey k1 = new KerberosKey(c, new byte[16], 17, 1); + EncryptionKey k2 = new EncryptionKey(new byte[16], 17); + KerberosCredMessage m = new KerberosCredMessage(c, s, new byte[1]); + + // These get calls should throw IllegalStateException + k1.destroy(); + checkISE(() -> k1.getAlgorithm()); + checkISE(() -> k1.getEncoded()); + checkISE(() -> k1.getFormat()); + checkISE(() -> k1.getKeyType()); + checkISE(() -> k1.getPrincipal()); + checkISE(() -> k1.getVersionNumber()); + + k2.destroy(); + checkISE(() -> k2.getAlgorithm()); + checkISE(() -> k2.getEncoded()); + checkISE(() -> k2.getFormat()); + checkISE(() -> k2.getKeyType()); + + m.destroy(); + checkISE(() -> m.getSender()); + checkISE(() -> m.getRecipient()); + checkISE(() -> m.getEncoded()); + } + + static void checkNPE(Supplier f) throws Exception { + check(f, NullPointerException.class); + } + + static void checkISE(Supplier f) throws Exception { + check(f, IllegalStateException.class); + } + + static void check(Supplier f, Class type) throws Exception { + try { + f.get(); + } catch (Exception e) { + if (e.getClass() != type) { + throw e; + } else { + return; + } + } + throw new Exception("Should fail"); + } +} diff -r d553e7400295 -r 6c9ff31edda0 jdk/test/javax/xml/bind/xjc/8029837/PreParseGrammarTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/xml/bind/xjc/8029837/PreParseGrammarTest.java Wed Jul 05 19:52:15 2017 +0200 @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8029837 + * @summary Test simulates the partial call to xjc ant task that fails with + * NullPointer exception + * @run main/othervm PreParseGrammarTest + */ + +import com.sun.org.apache.xerces.internal.parsers.XMLGrammarPreparser; +import com.sun.org.apache.xerces.internal.xni.XNIException; +import com.sun.org.apache.xerces.internal.xni.grammars.Grammar; +import com.sun.org.apache.xerces.internal.xni.grammars.XMLGrammarDescription; +import com.sun.org.apache.xerces.internal.xni.parser.XMLInputSource; +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; + +public class PreParseGrammarTest { + + public static void main(String[] args) throws FileNotFoundException, XNIException, IOException { + File xsdf = new File(System.getProperty("test.src", ".") + "/test.xsd"); + InputStream is = new BufferedInputStream(new FileInputStream(xsdf)); + XMLInputSource xis = new XMLInputSource(null, null, null, is, null); + XMLGrammarPreparser gp = new XMLGrammarPreparser(); + gp.registerPreparser(XMLGrammarDescription.XML_SCHEMA, null); + //The NullPointerException is observed on next call during ant task + // execution + Grammar res = gp.preparseGrammar(XMLGrammarDescription.XML_SCHEMA, xis); + System.out.println("Grammar preparsed successfully:" + res); + return; + } +} diff -r d553e7400295 -r 6c9ff31edda0 jdk/test/javax/xml/bind/xjc/8029837/test.xsd --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/xml/bind/xjc/8029837/test.xsd Wed Jul 05 19:52:15 2017 +0200 @@ -0,0 +1,4 @@ + + + + diff -r d553e7400295 -r 6c9ff31edda0 jdk/test/sun/misc/JavaLangAccess/FormatUnsigned.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/misc/JavaLangAccess/FormatUnsigned.java Wed Jul 05 19:52:15 2017 +0200 @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import sun.misc.JavaLangAccess; +import sun.misc.SharedSecrets; + +/* + * @test + * @summary Test JavaLangAccess.formatUnsignedInt/-Long + * @bug 8050114 + */ +public class FormatUnsigned { + + static final JavaLangAccess jla = SharedSecrets.getJavaLangAccess(); + + public static void testFormatUnsignedInt() { + testFormatUnsignedInt("7fffffff", Integer.MAX_VALUE, 8, 4, 0, 8); + testFormatUnsignedInt("80000000", Integer.MIN_VALUE, 8, 4, 0, 8); + testFormatUnsignedInt("4711", 04711, 4, 3, 0, 4); + testFormatUnsignedInt("4711", 0x4711, 4, 4, 0, 4); + testFormatUnsignedInt("1010", 0b1010, 4, 1, 0, 4); + testFormatUnsignedInt("00001010", 0b1010, 8, 1, 0, 8); + testFormatUnsignedInt("\u0000\u000000001010", 0b1010, 10, 1, 2, 8); + } + + public static void testFormatUnsignedLong() { + testFormatUnsignedLong("7fffffffffffffff", Long.MAX_VALUE, 16, 4, 0, 16); + testFormatUnsignedLong("8000000000000000", Long.MIN_VALUE, 16, 4, 0, 16); + testFormatUnsignedLong("4711", 04711L, 4, 3, 0, 4); + testFormatUnsignedLong("4711", 0x4711L, 4, 4, 0, 4); + testFormatUnsignedLong("1010", 0b1010L, 4, 1, 0, 4); + testFormatUnsignedLong("00001010", 0b1010L, 8, 1, 0, 8); + testFormatUnsignedLong("\u0000\u000000001010", 0b1010L, 10, 1, 2, 8); + } + + public static void testFormatUnsignedInt(String expected, int value, int arraySize, int shift, int offset, int length) { + char[] chars = new char[arraySize]; + jla.formatUnsignedInt(value, shift, chars, offset, length); + String s = new String(chars); + if (!expected.equals(s)) { + throw new Error(s + " should be equal to expected " + expected); + } + } + + public static void testFormatUnsignedLong(String expected, long value, int arraySize, int shift, int offset, int length) { + char[] chars = new char[arraySize]; + jla.formatUnsignedLong(value, shift, chars, offset, length); + String s = new String(chars); + if (!expected.equals(s)) { + throw new Error(s + " should be equal to expected " + expected); + } + } + + public static void main(String[] args) { + testFormatUnsignedInt(); + testFormatUnsignedLong(); + } +} diff -r d553e7400295 -r 6c9ff31edda0 jdk/test/sun/security/jgss/spnego/NotPreferredMech.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/security/jgss/spnego/NotPreferredMech.java Wed Jul 05 19:52:15 2017 +0200 @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8048194 + * @run main/othervm NotPreferredMech + * @summary GSSContext.acceptSecContext fails when a supported mech is not initiator preferred + */ + +import org.ietf.jgss.*; +import sun.security.jgss.*; +import sun.security.jgss.spnego.NegTokenInit; +import sun.security.jgss.spnego.NegTokenTarg; +import sun.security.util.BitArray; +import sun.security.util.DerOutputStream; +import sun.security.util.DerValue; +import sun.security.util.ObjectIdentifier; + +import java.io.ByteArrayOutputStream; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; + +public class NotPreferredMech { + + public static void main(String[] argv) throws Exception { + + // Generates a NegTokenInit mechTypes field, with an + // unsupported mech as the preferred. + DerOutputStream mech = new DerOutputStream(); + mech.write(new Oid("1.2.3.4").getDER()); + mech.write(GSSUtil.GSS_KRB5_MECH_OID.getDER()); + DerOutputStream mechTypeList = new DerOutputStream(); + mechTypeList.write(DerValue.tag_Sequence, mech); + + // Generates a NegTokenInit mechToken field for 1.2.3.4 mech + GSSHeader h1 = new GSSHeader(new ObjectIdentifier("1.2.3.4"), 1); + ByteArrayOutputStream bout = new ByteArrayOutputStream(); + h1.encode(bout); + bout.write(new byte[1]); + + // Generates the NegTokenInit token + Constructor ctor = NegTokenInit.class.getDeclaredConstructor( + byte[].class, BitArray.class, byte[].class, byte[].class); + ctor.setAccessible(true); + NegTokenInit initToken = ctor.newInstance( + mechTypeList.toByteArray(), + new BitArray(0), + bout.toByteArray(), + null); + Method m = Class.forName("sun.security.jgss.spnego.SpNegoToken") + .getDeclaredMethod("getEncoded"); + m.setAccessible(true); + byte[] spnegoToken = (byte[])m.invoke(initToken); + + // and wraps it into a GSSToken + GSSHeader h = new GSSHeader( + new ObjectIdentifier(GSSUtil.GSS_SPNEGO_MECH_OID.toString()), + spnegoToken.length); + bout = new ByteArrayOutputStream(); + h.encode(bout); + bout.write(spnegoToken); + byte[] token = bout.toByteArray(); + + // and feeds it to a GSS acceptor + GSSManager man = GSSManager.getInstance(); + GSSContext ctxt = man.createContext((GSSCredential) null); + token = ctxt.acceptSecContext(token, 0, token.length); + NegTokenTarg targ = new NegTokenTarg(token); + + // Make sure it's a GO-ON message + Method m2 = NegTokenTarg.class.getDeclaredMethod("getNegotiatedResult"); + m2.setAccessible(true); + int negResult = (int)m2.invoke(targ); + + if (negResult != 1 /* ACCEPT_INCOMPLETE */) { + throw new Exception("Not a continue"); + } + } +} diff -r d553e7400295 -r 6c9ff31edda0 jdk/test/sun/security/krb5/auto/Context.java --- a/jdk/test/sun/security/krb5/auto/Context.java Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/test/sun/security/krb5/auto/Context.java Wed Jul 05 19:52:15 2017 +0200 @@ -26,9 +26,11 @@ import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; import java.util.Arrays; +import java.util.Base64; import java.util.HashMap; import java.util.Map; import javax.security.auth.Subject; +import javax.security.auth.kerberos.KerberosCredMessage; import javax.security.auth.kerberos.KerberosKey; import javax.security.auth.kerberos.KerberosTicket; import javax.security.auth.login.LoginContext; @@ -86,7 +88,6 @@ /** * Using the delegated credentials from a previous acceptor - * @param c */ public Context delegated() throws Exception { Context out = new Context(); @@ -177,7 +178,6 @@ /** * Logins with username/keytab as an existing Subject. The * same subject can be used multiple times to simulate multiple logins. - * @param s existing subject */ public static Context fromUserKtab( String user, String ktab, boolean storeKey) throws Exception { @@ -411,6 +411,12 @@ Key k = (Key)ex.inquireSecContext( InquireType.KRB5_GET_SESSION_KEY); if (k == null) { + throw new Exception("(Old) Session key cannot be null"); + } + System.out.println("(Old) Session key is: " + k); + Key k2 = (Key)ex.inquireSecContext( + InquireType.KRB5_GET_SESSION_KEY_EX); + if (k2 == null) { throw new Exception("Session key cannot be null"); } System.out.println("Session key is: " + k); @@ -431,6 +437,19 @@ InquireType.KRB5_GET_AUTHZ_DATA); System.out.println("AuthzData is: " + Arrays.toString(ad)); } + try { + KerberosCredMessage tok = (KerberosCredMessage)ex.inquireSecContext( + InquireType.KRB5_GET_KRB_CRED); + System.out.println("KRB_CRED is " + + (tok == null?"not ":"") + "available"); + if (tok != null) { + System.out.println("From " + tok.getSender() + " to " + + tok.getRecipient()); + System.out.println(Base64.getEncoder().encodeToString(tok.getEncoded())); + } + } catch (Exception e) { + System.out.println("KRB_CRED is not available: " + e); + } } } } diff -r d553e7400295 -r 6c9ff31edda0 jdk/test/sun/security/krb5/auto/KerberosHashEqualsTest.java --- a/jdk/test/sun/security/krb5/auto/KerberosHashEqualsTest.java Wed Jul 30 11:49:21 2014 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,174 +0,0 @@ -/* - * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/* - * @test - * @bug 4641821 - * @run main/othervm KerberosHashEqualsTest - * @summary hashCode() and equals() for KerberosKey and KerberosTicket - */ - -import java.net.InetAddress; -import java.util.Date; -import javax.security.auth.kerberos.KerberosKey; -import javax.security.auth.kerberos.KerberosPrincipal; -import javax.security.auth.kerberos.KerberosTicket; - -public class KerberosHashEqualsTest { - public static void main(String[] args) throws Exception { - new OneKDC(null); - new KerberosHashEqualsTest().check(); - } - - void checkSame(Object o1, Object o2) { - if(!o1.equals(o2)) { - throw new RuntimeException("equals() fails"); - } - if(o1.hashCode() != o2.hashCode()) { - throw new RuntimeException("hashCode() not same"); - } - } - - void checkNotSame(Object o1, Object o2) { - if(o1.equals(o2)) { - throw new RuntimeException("equals() succeeds"); - } - } - - void check() throws Exception { - - // The key part: - // new KerberosKey(principal, bytes, keyType, version) - - KerberosKey k1, k2; - KerberosPrincipal CLIENT = new KerberosPrincipal("client"); - KerberosPrincipal SERVER = new KerberosPrincipal("server"); - byte[] PASS = "pass".getBytes(); - - k1 = new KerberosKey(CLIENT, PASS, 1, 1); - k2 = new KerberosKey(CLIENT, PASS, 1, 1); - checkSame(k1, k1); // me is me - checkSame(k1, k2); // same - - // A destroyed key doesn't equal to any key - k2.destroy(); - checkNotSame(k1, k2); - checkNotSame(k2, k1); - k1.destroy(); - checkNotSame(k1, k2); // even if they are both destroyed - checkNotSame(k2, k1); - checkSame(k2, k2); - - // a little difference means not equal - k1 = new KerberosKey(CLIENT, PASS, 1, 1); - k2 = new KerberosKey(SERVER, PASS, 1, 1); - checkNotSame(k1, k2); // Different principal name - - k2 = new KerberosKey(CLIENT, "ssap".getBytes(), 1, 1); - checkNotSame(k1, k2); // Different password - - k2 = new KerberosKey(CLIENT, PASS, 2, 1); - checkNotSame(k1, k2); // Different keytype - - k2 = new KerberosKey(CLIENT, PASS, 1, 2); - checkNotSame(k1, k2); // Different version - - k2 = new KerberosKey(null, PASS, 1, 2); - checkNotSame(k1, k2); // null is not non-null - - k1 = new KerberosKey(null, PASS, 1, 2); - checkSame(k1, k2); // null is null - - checkNotSame(k1, "Another Object"); - - // The ticket part: - // new KerberosTicket(asn1 bytes, client, server, session key, type, flags, - // auth, start, end, renewUntil times, address) - - KerberosTicket t1, t2; - - byte[] ASN1 = "asn1".getBytes(); - boolean[] FORWARDABLE = new boolean[] {true, true}; - boolean[] ALLTRUE = new boolean[] {true, true, true, true, true, true, true, true, true, true}; - Date D0 = new Date(0); - - t1 = new KerberosTicket(ASN1, CLIENT, SERVER, PASS, 1, FORWARDABLE, D0, D0, D0, D0, null); - t2 = new KerberosTicket(ASN1, CLIENT, SERVER, PASS, 1, FORWARDABLE, D0, D0, D0, D0, null); - checkSame(t1, t1); - checkSame(t1, t2); - - // destroyed tickets doesn't equal to each other - t1.destroy(); - checkNotSame(t1, t2); - checkNotSame(t2, t1); - - t2.destroy(); - checkNotSame(t1, t2); // even if they are both destroyed - checkNotSame(t2, t1); - - checkSame(t2, t2); // unless they are the same object - - // a little difference means not equal - t1 = new KerberosTicket(ASN1, CLIENT, SERVER, PASS, 1, FORWARDABLE, D0, D0, D0, D0, null); - t2 = new KerberosTicket("asn11".getBytes(), CLIENT, SERVER, PASS, 1, FORWARDABLE, D0, D0, D0, D0, null); - checkNotSame(t1, t2); // Different ASN1 encoding - - t2 = new KerberosTicket(ASN1, new KerberosPrincipal("client1"), SERVER, PASS, 1, FORWARDABLE, D0, D0, D0, D0, null); - checkNotSame(t1, t2); // Different client - - t2 = new KerberosTicket(ASN1, CLIENT, new KerberosPrincipal("server1"), PASS, 1, FORWARDABLE, D0, D0, D0, D0, null); - checkNotSame(t1, t2); // Different server - - t2 = new KerberosTicket(ASN1, CLIENT, SERVER, "pass1".getBytes(), 1, FORWARDABLE, D0, D0, D0, D0, null); - checkNotSame(t1, t2); // Different session key - - t2 = new KerberosTicket(ASN1, CLIENT, SERVER, PASS, 2, FORWARDABLE, D0, D0, D0, D0, null); - checkNotSame(t1, t2); // Different key type - - t2 = new KerberosTicket(ASN1, CLIENT, SERVER, PASS, 1, new boolean[] {true, false}, D0, D0, D0, D0, null); - checkNotSame(t1, t2); // Different flags, not FORWARDABLE - - t2 = new KerberosTicket(ASN1, CLIENT, SERVER, PASS, 1, FORWARDABLE, new Date(1), D0, D0, D0, null); - checkNotSame(t1, t2); // Different authtime - - t2 = new KerberosTicket(ASN1, CLIENT, SERVER, PASS, 1, FORWARDABLE, D0, new Date(1), D0, D0, null); - checkNotSame(t1, t2); // Different starttime - - t2 = new KerberosTicket(ASN1, CLIENT, SERVER, PASS, 1, FORWARDABLE, D0, D0, new Date(1), D0, null); - checkNotSame(t1, t2); // Different endtime - - t2 = new KerberosTicket(ASN1, CLIENT, SERVER, PASS, 1, FORWARDABLE, D0, D0, D0, D0, new InetAddress[2]); - checkNotSame(t1, t2); // Different client addresses - - t2 = new KerberosTicket(ASN1, CLIENT, SERVER, PASS, 1, FORWARDABLE, D0, D0, D0, new Date(1), null); - t1 = new KerberosTicket(ASN1, CLIENT, SERVER, PASS, 1, FORWARDABLE, D0, D0, D0, new Date(2), null); - checkSame(t1, t2); // renewtill is ignored when RENEWABLE ticket flag is not set. - - t2 = new KerberosTicket(ASN1, CLIENT, SERVER, PASS, 1, ALLTRUE, D0, D0, D0, new Date(1), null); - t1 = new KerberosTicket(ASN1, CLIENT, SERVER, PASS, 1, ALLTRUE, D0, D0, D0, new Date(2), null); - checkNotSame(t1, t2); // renewtill is used when RENEWABLE is set. - - checkNotSame(t1, "Another Object"); - System.out.println("Good!"); - } -} diff -r d553e7400295 -r 6c9ff31edda0 jdk/test/sun/security/krb5/auto/NewInquireTypes.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/security/krb5/auto/NewInquireTypes.java Wed Jul 05 19:52:15 2017 +0200 @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8043071 + * @summary Expose session key and KRB_CRED through extended GSS-API + * @compile -XDignore.symbol.file NewInquireTypes.java + * @run main/othervm NewInquireTypes + */ + +import com.sun.security.jgss.InquireType; +import sun.security.jgss.GSSUtil; +import sun.security.krb5.internal.KRBCred; +import sun.security.krb5.internal.crypto.KeyUsage; + +import javax.security.auth.kerberos.KerberosCredMessage; +import javax.security.auth.kerberos.EncryptionKey; + +public class NewInquireTypes { + + public static void main(String[] args) throws Exception { + + new OneKDC(null).writeJAASConf(); + + Context c, s; + c = Context.fromJAAS("client"); + s = Context.fromJAAS("server"); + + c.startAsClient(OneKDC.SERVER, GSSUtil.GSS_KRB5_MECH_OID); + s.startAsServer(GSSUtil.GSS_KRB5_MECH_OID); + + Context.handshake(c, s); + + EncryptionKey key = (EncryptionKey) + c.x().inquireSecContext(InquireType.KRB5_GET_SESSION_KEY_EX); + KerberosCredMessage cred = (KerberosCredMessage) + c.x().inquireSecContext(InquireType.KRB5_GET_KRB_CRED); + + // Confirm the KRB_CRED message is encrypted with the session key. + new KRBCred(cred.getEncoded()).encPart.decrypt( + new sun.security.krb5.EncryptionKey(key.getKeyType(), key.getEncoded()), + KeyUsage.KU_ENC_KRB_CRED_PART); + } +} diff -r d553e7400295 -r 6c9ff31edda0 jdk/test/sun/security/smartcardio/TestAll.java --- a/jdk/test/sun/security/smartcardio/TestAll.java Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/test/sun/security/smartcardio/TestAll.java Wed Jul 05 19:52:15 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,7 +26,7 @@ // Because all the tests are marked @ignore as they require special hardware, // we cannot use jtreg to do this. -import java.lang.reflect.*; +import java.lang.reflect.Method; public class TestAll { diff -r d553e7400295 -r 6c9ff31edda0 jdk/test/sun/security/smartcardio/TestChannel.java --- a/jdk/test/sun/security/smartcardio/TestChannel.java Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/test/sun/security/smartcardio/TestChannel.java Wed Jul 05 19:52:15 2017 +0200 @@ -31,10 +31,10 @@ // This test requires special hardware. -import java.io.*; -import java.util.*; - -import javax.smartcardio.*; +import javax.smartcardio.Card; +import javax.smartcardio.CardChannel; +import javax.smartcardio.CardTerminal; +import javax.smartcardio.CommandAPDU; public class TestChannel extends Utils { @@ -95,7 +95,7 @@ } // disconnect - card.disconnect(false); + card.disconnect(true); System.out.println("OK."); } diff -r d553e7400295 -r 6c9ff31edda0 jdk/test/sun/security/smartcardio/TestConnect.java --- a/jdk/test/sun/security/smartcardio/TestConnect.java Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/test/sun/security/smartcardio/TestConnect.java Wed Jul 05 19:52:15 2017 +0200 @@ -31,10 +31,11 @@ // This test requires special hardware. -import java.io.*; -import java.util.*; - -import javax.smartcardio.*; +import java.util.List; +import javax.smartcardio.TerminalFactory; +import javax.smartcardio.Card; +import javax.smartcardio.CardChannel; +import javax.smartcardio.CardTerminal; public class TestConnect extends Utils { @@ -63,7 +64,7 @@ throw new Exception("Not T=0 protocol"); } transmit(card); - card.disconnect(false); + card.disconnect(true); try { transmit(card); @@ -96,7 +97,7 @@ throw new Exception("Not T=0 protocol"); } transmit(card); - card.disconnect(true); + card.disconnect(false); card = terminal.connect("*"); System.out.println("card: " + card); @@ -105,7 +106,6 @@ } transmit(card); card.disconnect(true); - card.disconnect(true); System.out.println("OK."); } diff -r d553e7400295 -r 6c9ff31edda0 jdk/test/sun/security/smartcardio/TestConnectAgain.java --- a/jdk/test/sun/security/smartcardio/TestConnectAgain.java Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/test/sun/security/smartcardio/TestConnectAgain.java Wed Jul 05 19:52:15 2017 +0200 @@ -31,10 +31,10 @@ // This test requires special hardware. -import java.io.*; -import java.util.*; - -import javax.smartcardio.*; +import javax.smartcardio.Card; +import javax.smartcardio.CardException; +import javax.smartcardio.CardChannel; +import javax.smartcardio.CardTerminal; public class TestConnectAgain extends Utils { @@ -95,7 +95,7 @@ } // disconnect - card.disconnect(false); + card.disconnect(true); System.out.println("OK."); } diff -r d553e7400295 -r 6c9ff31edda0 jdk/test/sun/security/smartcardio/TestControl.java --- a/jdk/test/sun/security/smartcardio/TestControl.java Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/test/sun/security/smartcardio/TestControl.java Wed Jul 05 19:52:15 2017 +0200 @@ -31,10 +31,9 @@ // This test requires special hardware. -import java.io.*; -import java.util.*; - -import javax.smartcardio.*; +import javax.smartcardio.Card; +import javax.smartcardio.CardException; +import javax.smartcardio.CardTerminal; public class TestControl extends Utils { @@ -68,7 +67,7 @@ } // disconnect - card.disconnect(false); + card.disconnect(true); System.out.println("OK."); } diff -r d553e7400295 -r 6c9ff31edda0 jdk/test/sun/security/smartcardio/TestDefault.java --- a/jdk/test/sun/security/smartcardio/TestDefault.java Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/test/sun/security/smartcardio/TestDefault.java Wed Jul 05 19:52:15 2017 +0200 @@ -31,10 +31,9 @@ // This test requires special hardware. -import java.io.*; -import java.util.*; - -import javax.smartcardio.*; +import java.util.List; +import javax.smartcardio.CardTerminal; +import javax.smartcardio.TerminalFactory; public class TestDefault { diff -r d553e7400295 -r 6c9ff31edda0 jdk/test/sun/security/smartcardio/TestExclusive.java --- a/jdk/test/sun/security/smartcardio/TestExclusive.java Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/test/sun/security/smartcardio/TestExclusive.java Wed Jul 05 19:52:15 2017 +0200 @@ -31,10 +31,11 @@ // This test requires special hardware. -import java.io.*; -import java.util.*; - -import javax.smartcardio.*; +import javax.smartcardio.Card; +import javax.smartcardio.CardChannel; +import javax.smartcardio.CardException; +import javax.smartcardio.CardTerminal; +import javax.smartcardio.CommandAPDU; public class TestExclusive extends Utils { @@ -84,9 +85,9 @@ Thread.sleep(1000); // disconnect - card.disconnect(false); + card.disconnect(true); - if (otherOK == false) { + if (! otherOK) { throw new Exception("Secondary thread failed"); } diff -r d553e7400295 -r 6c9ff31edda0 jdk/test/sun/security/smartcardio/TestMultiplePresent.java --- a/jdk/test/sun/security/smartcardio/TestMultiplePresent.java Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/test/sun/security/smartcardio/TestMultiplePresent.java Wed Jul 05 19:52:15 2017 +0200 @@ -31,10 +31,10 @@ // This test requires special hardware. -import java.io.*; -import java.util.*; - -import javax.smartcardio.*; +import java.util.List; +import javax.smartcardio.CardTerminal; +import javax.smartcardio.CardTerminals; +import javax.smartcardio.TerminalFactory; import static javax.smartcardio.CardTerminals.State.*; public class TestMultiplePresent { diff -r d553e7400295 -r 6c9ff31edda0 jdk/test/sun/security/smartcardio/TestPresent.java --- a/jdk/test/sun/security/smartcardio/TestPresent.java Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/test/sun/security/smartcardio/TestPresent.java Wed Jul 05 19:52:15 2017 +0200 @@ -31,10 +31,9 @@ // This test requires special hardware. -import java.io.*; -import java.util.*; - -import javax.smartcardio.*; +import java.util.List; +import javax.smartcardio.CardTerminal; +import javax.smartcardio.TerminalFactory; public class TestPresent { diff -r d553e7400295 -r 6c9ff31edda0 jdk/test/sun/security/smartcardio/TestTransmit.java --- a/jdk/test/sun/security/smartcardio/TestTransmit.java Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/test/sun/security/smartcardio/TestTransmit.java Wed Jul 05 19:52:15 2017 +0200 @@ -31,10 +31,16 @@ // This test requires special hardware. -import java.io.*; -import java.util.*; - -import javax.smartcardio.*; +import java.io.BufferedReader; +import java.io.ByteArrayOutputStream; +import java.io.FileReader; +import java.io.IOException; +import java.io.StringReader; +import javax.smartcardio.Card; +import javax.smartcardio.CardChannel; +import javax.smartcardio.CardTerminal; +import javax.smartcardio.CommandAPDU; +import javax.smartcardio.ResponseAPDU; public class TestTransmit extends Utils { @@ -79,7 +85,7 @@ } // disconnect - card.disconnect(false); + card.disconnect(true); System.out.println("OK."); } diff -r d553e7400295 -r 6c9ff31edda0 jdk/test/sun/security/smartcardio/Utils.java --- a/jdk/test/sun/security/smartcardio/Utils.java Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/test/sun/security/smartcardio/Utils.java Wed Jul 05 19:52:15 2017 +0200 @@ -24,10 +24,16 @@ // common utility functions for the PC/SC tests -import javax.smartcardio.*; - -import java.io.*; -import java.util.*; +import java.io.StringReader; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import javax.smartcardio.CardTerminal; +import javax.smartcardio.CardChannel; +import javax.smartcardio.ResponseAPDU; +import javax.smartcardio.CommandAPDU; +import javax.smartcardio.TerminalFactory; public class Utils { diff -r d553e7400295 -r 6c9ff31edda0 jdk/test/sun/security/tools/jarsigner/default_options.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/security/tools/jarsigner/default_options.sh Wed Jul 05 19:52:15 2017 +0200 @@ -0,0 +1,64 @@ +# +# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +# @test +# @bug 8049834 +# @summary Two security tools tests do not run with only JRE +# + +if [ "${TESTJAVA}" = "" ] ; then + JAVAC_CMD=`which javac` + TESTJAVA=`dirname $JAVAC_CMD`/.. +fi + +KS=ks +KEYTOOL="$TESTJAVA/bin/keytool ${TESTTOOLVMOPTS}" +JAR="$TESTJAVA/bin/jar ${TESTTOOLVMOPTS}" +JARSIGNER="$TESTJAVA/bin/jarsigner ${TESTTOOLVMOPTS}" + +rm $KS 2> /dev/null + +PASS=changeit +export PASS + +$KEYTOOL -genkeypair -dname CN=A -alias a \ + -storepass:env PASS -keypass:env PASS -keystore $KS \ + -keyalg rsa || exit 1 + +cat < js.conf +jarsigner.all = -keystore \${user.dir}/$KS -storepass:env PASS -debug -strict +jarsigner.sign = -digestalg SHA1 +jarsigner.verify = -verbose:summary + +EOF + +$JAR cvf a.jar ks js.conf + +$JARSIGNER -conf js.conf a.jar a || exit 21 +$JARSIGNER -conf js.conf -verify a.jar > jarsigner.out || exit 22 +grep "and 1 more" jarsigner.out || exit 23 +$JAR xvf a.jar META-INF/MANIFEST.MF +grep "SHA1-Digest" META-INF/MANIFEST.MF || exit 24 + +echo Done +exit 0 diff -r d553e7400295 -r 6c9ff31edda0 jdk/test/sun/security/tools/jarsigner/weaksize.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/security/tools/jarsigner/weaksize.sh Wed Jul 05 19:52:15 2017 +0200 @@ -0,0 +1,60 @@ +# +# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +# @test +# @bug 8044755 +# @summary Add a test for algorithm constraints check in jarsigner +# + +if [ "${TESTJAVA}" = "" ] ; then + JAVAC_CMD=`which javac` + TESTJAVA=`dirname $JAVAC_CMD`/.. +fi + +# The sigalg used is MD2withRSA, which is obsolete. + +KT="$TESTJAVA/bin/keytool ${TESTTOOLVMOPTS} -keystore ks + -storepass changeit -keypass changeit + -keyalg rsa -sigalg MD2withRSA -debug" +JS="$TESTJAVA/bin/jarsigner ${TESTTOOLVMOPTS} -keystore ks + -storepass changeit -strict -debug" +JAR="$TESTJAVA/bin/jar ${TESTTOOLVMOPTS}" + +rm ks 2> /dev/null + +$KT -genkeypair -alias ca -dname CN=CA -ext bc +$KT -genkeypair -alias signer -dname CN=Signer + +$KT -certreq -alias signer | \ + $KT -gencert -alias ca -ext ku=dS -rfc | \ + $KT -importcert -alias signer + +$JAR cvf a.jar ks + +# We always trust a TrustedCertificateEntry +$JS a.jar ca || exit 1 + +# An end-entity cert must follow algorithm constraints +$JS a.jar signer && exit 2 + +exit 0 diff -r d553e7400295 -r 6c9ff31edda0 jdk/test/sun/security/tools/keytool/default_options.sh --- a/jdk/test/sun/security/tools/keytool/default_options.sh Wed Jul 30 11:49:21 2014 -0700 +++ b/jdk/test/sun/security/tools/keytool/default_options.sh Wed Jul 05 19:52:15 2017 +0200 @@ -33,16 +33,12 @@ KS=ks KEYTOOL="$TESTJAVA/bin/keytool ${TESTTOOLVMOPTS}" -JAR="$TESTJAVA/bin/jar ${TESTTOOLVMOPTS}" -JARSIGNER="$TESTJAVA/bin/jarsigner ${TESTTOOLVMOPTS}" rm $KS 2> /dev/null PASS=changeit export PASS -# keytool - cat < kt.conf # A Pre-configured options file keytool.all = -storepass:env PASS -keypass:env PASS -keystore \${user.dir}/$KS -debug @@ -69,23 +65,6 @@ # Single-valued option on command line overrides again $KEYTOOL -conf kt.conf -delete -alias b -keystore $KS || exit 17 -# jarsigner - -cat < js.conf -jarsigner.all = -keystore \${user.dir}/$KS -storepass:env PASS -debug -strict -jarsigner.sign = -digestalg SHA1 -jarsigner.verify = -verbose:summary - -EOF - -$JAR cvf a.jar ks js.conf kt.conf - -$JARSIGNER -conf js.conf a.jar a || exit 21 -$JARSIGNER -conf js.conf -verify a.jar > jarsigner.out || exit 22 -grep "and 2 more" jarsigner.out || exit 23 -$JAR xvf a.jar META-INF/MANIFEST.MF -grep "SHA1-Digest" META-INF/MANIFEST.MF || exit 24 - # Error cases # File does not exist diff -r d553e7400295 -r 6c9ff31edda0 jdk/test/sun/security/tools/keytool/weaksize.sh --- a/jdk/test/sun/security/tools/keytool/weaksize.sh Wed Jul 30 11:49:21 2014 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,60 +0,0 @@ -# -# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# - -# @test -# @bug 8044755 -# @summary Add a test for algorithm constraints check in jarsigner -# - -if [ "${TESTJAVA}" = "" ] ; then - JAVAC_CMD=`which javac` - TESTJAVA=`dirname $JAVAC_CMD`/.. -fi - -# The sigalg used is MD2withRSA, which is obsolete. - -KT="$TESTJAVA/bin/keytool ${TESTTOOLVMOPTS} -keystore ks - -storepass changeit -keypass changeit - -keyalg rsa -sigalg MD2withRSA -debug" -JS="$TESTJAVA/bin/jarsigner ${TESTTOOLVMOPTS} -keystore ks - -storepass changeit -strict -debug" -JAR="$TESTJAVA/bin/jar ${TESTTOOLVMOPTS}" - -rm ks 2> /dev/null - -$KT -genkeypair -alias ca -dname CN=CA -ext bc -$KT -genkeypair -alias signer -dname CN=Signer - -$KT -certreq -alias signer | \ - $KT -gencert -alias ca -ext ku=dS -rfc | \ - $KT -importcert -alias signer - -$JAR cvf a.jar ks - -# We always trust a TrustedCertificateEntry -$JS a.jar ca || exit 1 - -# An end-entity cert must follow algorithm constraints -$JS a.jar signer && exit 2 - -exit 0 diff -r d553e7400295 -r 6c9ff31edda0 make/Javadoc.gmk --- a/make/Javadoc.gmk Wed Jul 30 11:49:21 2014 -0700 +++ b/make/Javadoc.gmk Wed Jul 05 19:52:15 2017 +0200 @@ -239,11 +239,15 @@ # Common echo of option define OptionOnly # opt - $(PRINTF) "%s\n" "$1" + if [ "$1" != "" ] ; then \ + $(PRINTF) "%s\n" "$1"; \ + fi endef + define OptionPair # opt arg $(PRINTF) "%s '%s'\n" "$1" '$2' endef + define OptionTrip # opt arg arg $(PRINTF) "%s '%s' '%s'\n" "$1" '$2' '$3' endef @@ -258,14 +262,7 @@ $(call CopyrightLine,$(COPYRIGHT_URL),$(FIRST_COPYRIGHT_YEAR),)\ -# Common javadoc options used by all -COMMON_JAVADOCFLAGS = \ - -XDignore.symbol.file=true \ - -quiet \ - -use \ - -keywords \ - -Xprofilespath $(JDK_TOPDIR)/make/profile-rtjar-includes.txt \ - $(ADDITIONAL_JAVADOCFLAGS) +# Common javadoc options used by all bundles ifdef OPENJDK ADDITIONAL_JAVADOCFLAGS = \ @@ -274,6 +271,52 @@ ADDITIONAL_JAVADOCFLAGS = endif +define COMMON_JAVADOCFLAGS + $(call OptionOnly,-XDignore.symbol.file=true) ; \ + $(call OptionOnly,-quiet) ; \ + $(call OptionOnly,-use) ; \ + $(call OptionOnly,-keywords) ; \ + $(call OptionPair,-Xprofilespath,$(JDK_TOPDIR)/make/profile-rtjar-includes.txt) ; \ + $(call OptionOnly,$(ADDITIONAL_JAVADOCFLAGS)) +endef + +# Common javadoc tags used by all bundles + +# Java language specification cite +TAG_JLS = jls:a:See \ +The Java™ Language Specification: + +# Java virtual machine specification cite +TAG_JVMS = jvms:a:See \ +The Java™ Virtual Machine Specification: + +# In order to get a specific ordering it's necessary to specify the total +# ordering of tags as the tags are otherwise ordered in order of definition. +define COMMON_JAVADOCTAGS + $(call OptionPair,-tag,beaninfo:X) ; \ + $(call OptionPair,-tag,revised:X) ; \ + $(call OptionPair,-tag,since.unbundled:X) ; \ + $(call OptionPair,-tag,spec:X) ; \ + $(call OptionPair,-tag,specdefault:X) ; \ + $(call OptionPair,-tag,Note:X) ; \ + $(call OptionPair,-tag,ToDo:X) ; \ + $(call OptionPair,-tag,apiNote:a:API Note:) ; \ + $(call OptionPair,-tag,implSpec:a:Implementation Requirements:) ; \ + $(call OptionPair,-tag,implNote:a:Implementation Note:) ; \ + $(call OptionPair,-tag,param) ; \ + $(call OptionPair,-tag,return) ; \ + $(call OptionPair,-tag,throws) ; \ + $(call OptionPair,-tag,since) ; \ + $(call OptionPair,-tag,version) ; \ + $(call OptionPair,-tag,serialData) ; \ + $(call OptionPair,-tag,factory) ; \ + $(call OptionPair,-tag,see) ; \ + $(call OptionPair,-tag,$(TAG_JVMS)) ; \ + $(call OptionPair,-tag,$(TAG_JLS)) +endef + + + # Draft used for non-fcs documents DRAFT_HEADER = ifneq ($(MILESTONE), fcs) @@ -338,10 +381,6 @@ COREAPI_HEADER = \ Java$(TRADEMARK) Platform
    Standard Ed. $(JDK_MINOR_VERSION)
    -# Java language specification cite -TAG_JLS = jls:a:See \ -The Java™ Language Specification: - # Overview file for core apis COREAPI_OVERVIEW = $(JDK_SHARE_CLASSES)/overview-core.html @@ -365,29 +404,11 @@ # Create file with javadoc options in it $(COREAPI_OPTIONS_FILE): $(COREAPI_OVERVIEW) $(prep-target) - @($(call OptionOnly,$(COMMON_JAVADOCFLAGS)) ; \ - $(call OptionOnly,-Xdoclint:none) ; \ + @($(call COMMON_JAVADOCFLAGS) ; \ + $(call COMMON_JAVADOCTAGS) ; \ + $(call OptionOnly,-Xdoclint:none) ; \ $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH)) ; \ $(call OptionPair,-encoding,ISO-8859-1) ; \ - $(call OptionPair,-tag,beaninfo:X) ; \ - $(call OptionPair,-tag,revised:X) ; \ - $(call OptionPair,-tag,since.unbundled:X) ; \ - $(call OptionPair,-tag,spec:X) ; \ - $(call OptionPair,-tag,specdefault:X) ; \ - $(call OptionPair,-tag,Note:X) ; \ - $(call OptionPair,-tag,ToDo:X) ; \ - $(call OptionPair,-tag,apiNote:a:API Note:) ; \ - $(call OptionPair,-tag,implSpec:a:Implementation Requirements:) ; \ - $(call OptionPair,-tag,implNote:a:Implementation Note:) ; \ - $(call OptionPair,-tag,param) ; \ - $(call OptionPair,-tag,return) ; \ - $(call OptionPair,-tag,throws) ; \ - $(call OptionPair,-tag,since) ; \ - $(call OptionPair,-tag,version) ; \ - $(call OptionPair,-tag,serialData) ; \ - $(call OptionPair,-tag,factory) ; \ - $(call OptionPair,-tag,see) ; \ - $(call OptionPair,-tag,$(TAG_JLS)) ; \ $(call OptionOnly,-splitIndex) ; \ $(call OptionPair,-overview,$(COREAPI_OVERVIEW)) ; \ $(call OptionPair,-doctitle,$(COREAPI_DOCTITLE)) ; \ @@ -441,7 +462,8 @@ # Create file with javadoc options in it $(DOCLETAPI_OPTIONS_FILE): $(prep-target) - @($(call OptionOnly,$(COMMON_JAVADOCFLAGS)) ; \ + @($(call COMMON_JAVADOCFLAGS) ; \ + $(call COMMON_JAVADOCTAGS) ; \ $(call OptionOnly,-Xdoclint:all) ; \ $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH)) ; \ $(call OptionPair,-encoding,ascii) ; \ @@ -498,7 +520,8 @@ # Create file with javadoc options in it $(TAGLETAPI_OPTIONS_FILE): $(prep-target) - @($(call OptionOnly,$(COMMON_JAVADOCFLAGS)) ; \ + @($(call COMMON_JAVADOCFLAGS) ; \ + $(call COMMON_JAVADOCTAGS) ; \ $(call OptionOnly,-Xdoclint:all) ; \ $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH)) ; \ $(call OptionPair,-encoding,ascii) ; \ @@ -550,7 +573,8 @@ # Create file with javadoc options in it $(DOMAPI_OPTIONS_FILE): $(prep-target) - @($(call OptionOnly,$(COMMON_JAVADOCFLAGS)) ; \ + @($(call COMMON_JAVADOCFLAGS) ; \ + $(call COMMON_JAVADOCTAGS) ; \ $(call OptionOnly,-Xdoclint:none) ; \ $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH)) ; \ $(call OptionPair,-encoding,ascii) ; \ @@ -613,7 +637,8 @@ # Create file with javadoc options in it $(JDI_OPTIONS_FILE): $(JDI_OVERVIEW) $(prep-target) - @($(call OptionOnly,$(COMMON_JAVADOCFLAGS)) ; \ + @($(call COMMON_JAVADOCFLAGS) ; \ + $(call COMMON_JAVADOCTAGS) ; \ $(call OptionOnly,-Xdoclint:none) ; \ $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH)) ; \ $(call OptionPair,-encoding,ascii) ; \ @@ -700,7 +725,8 @@ # Create file with javadoc options in it $(JAAS_OPTIONS_FILE): $(JAAS_OVERVIEW) $(prep-target) - @($(call OptionOnly,$(COMMON_JAVADOCFLAGS)) ; \ + @($(call COMMON_JAVADOCFLAGS) ; \ + $(call COMMON_JAVADOCTAGS) ; \ $(call OptionOnly,-Xdoclint:none) ; \ $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH)) ; \ $(call OptionPair,-encoding,ascii) ; \ @@ -753,7 +779,8 @@ # Create file with javadoc options in it $(JGSS_OPTIONS_FILE): $(JGSS_OVERVIEW) $(prep-target) - @($(call OptionOnly,$(COMMON_JAVADOCFLAGS)) ; \ + @($(call COMMON_JAVADOCFLAGS) ; \ + $(call COMMON_JAVADOCTAGS) ; \ $(call OptionOnly,-Xdoclint:none) ; \ $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH)) ; \ $(call OptionPair,-encoding,ascii) ; \ @@ -806,7 +833,8 @@ # Create file with javadoc options in it $(SMARTCARDIO_OPTIONS_FILE): $(prep-target) - @($(call OptionOnly,$(COMMON_JAVADOCFLAGS)) ; \ + @($(call COMMON_JAVADOCFLAGS) ; \ + $(call COMMON_JAVADOCTAGS) ; \ $(call OptionOnly,-Xdoclint:none) ; \ $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH)) ; \ $(call OptionPair,-encoding,ascii) ; \ @@ -857,7 +885,8 @@ # Create file with javadoc options in it $(HTTPSERVER_OPTIONS_FILE): $(prep-target) - @($(call OptionOnly,$(COMMON_JAVADOCFLAGS)) ; \ + @($(call COMMON_JAVADOCFLAGS) ; \ + $(call COMMON_JAVADOCTAGS) ; \ $(call OptionOnly,-Xdoclint:none) ; \ $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH)) ; \ $(call OptionPair,-encoding,ascii) ; \ @@ -917,7 +946,8 @@ # Create file with javadoc options in it $(MGMT_OPTIONS_FILE): $(MGMT_OVERVIEW) $(prep-target) - @($(call OptionOnly,$(COMMON_JAVADOCFLAGS)) ; \ + @($(call COMMON_JAVADOCFLAGS) ; \ + $(call COMMON_JAVADOCTAGS) ; \ $(call OptionOnly,-Xdoclint:none) ; \ $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH)) ; \ $(call OptionPair,-encoding,ascii) ; \ @@ -969,7 +999,8 @@ # Create file with javadoc options in it $(ATTACH_OPTIONS_FILE): $(prep-target) - @($(call OptionOnly,$(COMMON_JAVADOCFLAGS)) ; \ + @($(call COMMON_JAVADOCFLAGS) ; \ + $(call COMMON_JAVADOCTAGS) ; \ $(call OptionOnly,-Xdoclint:none) ; \ $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH)) ; \ $(call OptionPair,-encoding,ascii) ; \ @@ -1020,7 +1051,8 @@ # Create file with javadoc options in it $(JCONSOLE_OPTIONS_FILE): $(prep-target) - @($(call OptionOnly,$(COMMON_JAVADOCFLAGS)) ; \ + @($(call COMMON_JAVADOCFLAGS) ; \ + $(call COMMON_JAVADOCTAGS) ; \ $(call OptionOnly,-Xdoclint:none) ; \ $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH)) ; \ $(call OptionPair,-encoding,ascii) ; \ @@ -1073,14 +1105,14 @@ # Create file with javadoc options in it $(TREEAPI_OPTIONS_FILE): $(prep-target) - @($(call OptionOnly,$(COMMON_JAVADOCFLAGS)) ; \ + @($(call COMMON_JAVADOCFLAGS) ; \ + $(call COMMON_JAVADOCTAGS) ; \ $(call OptionOnly,-Xdoclint:all) ; \ $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH)) ; \ $(call OptionPair,-encoding,ascii) ; \ $(call OptionPair,-doctitle,$(TREEAPI_DOCTITLE)) ; \ $(call OptionPair,-windowtitle,$(TREEAPI_WINDOWTITLE) $(DRAFT_WINTITLE)); \ $(call OptionPair,-header,$(TREEAPI_HEADER)$(DRAFT_HEADER)) ; \ - $(call OptionPair,-tag,$(TAG_JLS)) ; \ $(call OptionPair,-bottom,$(TREEAPI_BOTTOM)$(DRAFT_BOTTOM)) ; \ $(call OptionTrip,-group,$(TREEAPI_GROUPNAME),$(TREEAPI_REGEXP)); \ $(call OptionTrip,-linkoffline,$(TREEAPI2COREAPI),$(COREAPI_DOCSDIR)/); \ @@ -1125,7 +1157,8 @@ # Create file with javadoc options in it $(SCTPAPI_OPTIONS_FILE): $(prep-target) - @($(call OptionOnly,$(COMMON_JAVADOCFLAGS)) ; \ + @($(call COMMON_JAVADOCFLAGS) ; \ + $(call COMMON_JAVADOCTAGS) ; \ $(call OptionOnly,-Xdoclint:none) ; \ $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH)) ; \ $(call OptionPair,-encoding,ascii) ; \ @@ -1176,7 +1209,8 @@ # Create file with javadoc options in it $(JDKNET_OPTIONS_FILE): $(prep-target) - @($(call OptionOnly,$(COMMON_JAVADOCFLAGS)) ; \ + @($(call COMMON_JAVADOCFLAGS) ; \ + $(call COMMON_JAVADOCTAGS) ; \ $(call OptionOnly,-Xdoclint:none) ; \ $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH)) ; \ $(call OptionPair,-encoding,ascii) ; \ diff -r d553e7400295 -r 6c9ff31edda0 make/jprt.properties --- a/make/jprt.properties Wed Jul 30 11:49:21 2014 -0700 +++ b/make/jprt.properties Wed Jul 05 19:52:15 2017 +0200 @@ -460,19 +460,23 @@ windows_i586_6.1-fastdebug-c2-hotspot_internalvmtests, \ windows_x64_6.1-fastdebug-c2-hotspot_internalvmtests -my.make.rule.test.targets.hotspot.wbapitests= \ - solaris_sparcv9_5.11-{product|fastdebug}-c2-hotspot_wbapitest, \ - solaris_x64_5.11-{product|fastdebug}-c2-hotspot_wbapitest, \ - linux_i586_2.6-{product|fastdebug}-c2-hotspot_wbapitest, \ - linux_x64_2.6-{product|fastdebug}-c2-hotspot_wbapitest, \ - windows_i586_6.1-{product|fastdebug}-c2-hotspot_wbapitest, \ - windows_x64_6.1-{product|fastdebug}-c2-hotspot_wbapitest, \ - linux_i586_2.6-{product|fastdebug}-c1-hotspot_wbapitest, \ - windows_i586_6.1-{product|fastdebug}-c1-hotspot_wbapitest +my.make.rule.test.targets.hotspot.reg.group= \ + solaris_sparcv9_5.11-{product|fastdebug}-c2-GROUP, \ + solaris_x64_5.11-{product|fastdebug}-c2-GROUP, \ + linux_i586_2.6-{product|fastdebug}-c2-GROUP, \ + linux_x64_2.6-{product|fastdebug}-c2-GROUP, \ + windows_i586_6.1-{product|fastdebug}-c2-GROUP, \ + windows_x64_6.1-{product|fastdebug}-c2-GROUP, \ + linux_i586_2.6-{product|fastdebug}-c1-GROUP, \ + windows_i586_6.1-{product|fastdebug}-c1-GROUP -my.make.rule.test.targets.hotspot= \ - ${my.make.rule.test.targets.hotspot.clienttests}, \ - ${my.make.rule.test.targets.hotspot.servertests}, \ - ${my.make.rule.test.targets.hotspot.internalvmtests}, \ - ${my.make.rule.test.targets.hotspot.wbapitests}, \ +my.make.rule.test.targets.hotspot= \ + ${my.make.rule.test.targets.hotspot.clienttests}, \ + ${my.make.rule.test.targets.hotspot.servertests}, \ + ${my.make.rule.test.targets.hotspot.internalvmtests}, \ + ${my.make.rule.test.targets.hotspot.reg.group:GROUP=hotspot_wbapitest}, \ + ${my.make.rule.test.targets.hotspot.reg.group:GROUP=hotspot_compiler}, \ + ${my.make.rule.test.targets.hotspot.reg.group:GROUP=hotspot_gc}, \ + ${my.make.rule.test.targets.hotspot.reg.group:GROUP=hotspot_runtime}, \ + ${my.make.rule.test.targets.hotspot.reg.group:GROUP=hotspot_serviceability}, \ ${my.additional.make.rule.test.targets.hotspot} diff -r d553e7400295 -r 6c9ff31edda0 nashorn/.hgtags --- a/nashorn/.hgtags Wed Jul 30 11:49:21 2014 -0700 +++ b/nashorn/.hgtags Wed Jul 05 19:52:15 2017 +0200 @@ -257,3 +257,4 @@ 174cf53bce4e93a3d5d880ed7915ce8d0f08bc5e jdk9-b21 a9d39bcfeb1bb3f7de929c56a2ecbea10a554ca1 jdk9-b22 aa3fda2d2967847dbd264aa962d624c07fc6c29f jdk9-b23 +49d7a2a66ae6b70fee367e2ceb29d0c20f8be01b jdk9-b24 diff -r d553e7400295 -r 6c9ff31edda0 nashorn/make/build-nasgen.xml --- a/nashorn/make/build-nasgen.xml Wed Jul 30 11:49:21 2014 -0700 +++ b/nashorn/make/build-nasgen.xml Wed Jul 05 19:52:15 2017 +0200 @@ -36,11 +36,13 @@ + + - + - + diff -r d553e7400295 -r 6c9ff31edda0 nashorn/make/build.xml --- a/nashorn/make/build.xml Wed Jul 30 11:49:21 2014 -0700 +++ b/nashorn/make/build.xml Wed Jul 05 19:52:15 2017 +0200 @@ -304,6 +304,14 @@ grant codeBase "file:/${basedir}/${file.reference.testng.jar}" { permission java.security.AllPermission; }; +//// in case of absolute path: +grant codeBase "file:/${nashorn.internal.tests.jar}" { + permission java.security.AllPermission; +}; + +grant codeBase "file:/${file.reference.testng.jar}" { + permission java.security.AllPermission; +}; grant codeBase "file:/${basedir}/test/script/trusted/*" { permission java.security.AllPermission; @@ -391,7 +399,7 @@ - + @@ -413,7 +421,7 @@ - + @@ -451,7 +459,7 @@ - + @@ -471,7 +479,7 @@ - + @@ -490,7 +498,7 @@ - + @@ -510,7 +518,7 @@ - + diff -r d553e7400295 -r 6c9ff31edda0 nashorn/make/project.properties --- a/nashorn/make/project.properties Wed Jul 30 11:49:21 2014 -0700 +++ b/nashorn/make/project.properties Wed Jul 05 19:52:15 2017 +0200 @@ -309,7 +309,7 @@ run.test.jvmargs.octane.main=${run.test.jvmargs.common} -XX:+UnlockDiagnosticVMOptions -XX:+UseNewCode -XX:TypeProfileLevel=222 # Security manager args - make sure that we run with the nashorn.policy that the build creates -run.test.jvmsecurityargs=-Xverify:all -Djava.security.manager -Djava.security.policy=${basedir}/build/nashorn.policy +run.test.jvmsecurityargs=-Xverify:all -Djava.security.manager -Djava.security.policy=${build.dir}/nashorn.policy # VM options for script tests with @fork option test-sys-prop.test.fork.jvm.options=${run.test.jvmargs.main} -Xmx${run.test.xmx} ${run.test.jvmsecurityargs} -cp ${run.test.classpath} diff -r d553e7400295 -r 6c9ff31edda0 nashorn/test/src/jdk/nashorn/internal/test/framework/TestHelper.java --- a/nashorn/test/src/jdk/nashorn/internal/test/framework/TestHelper.java Wed Jul 30 11:49:21 2014 -0700 +++ b/nashorn/test/src/jdk/nashorn/internal/test/framework/TestHelper.java Wed Jul 05 19:52:15 2017 +0200 @@ -39,7 +39,8 @@ public abstract class TestHelper { public static final String TEST_ROOT = "test"; - public static final String BUILD_ROOT = "build/test"; + public static final String BUILD_ROOT = + System.getProperty("build.dir", "build") + File.separator + "test"; public static final String TEST_PREFIX = TEST_ROOT + File.separator; private TestHelper() {