--- a/.hgtags-top-repo Thu Jun 19 11:22:36 2014 -0700
+++ b/.hgtags-top-repo Wed Jul 05 19:46:31 2017 +0200
@@ -261,3 +261,4 @@
cf22a728521f91a4692b433d39d730a0a1b23155 jdk9-b16
24152ee0ee1abef54a8bab04c099261dba7bcca5 jdk9-b17
65abab59f783fcf02ff8e133431c252f9e5f07d5 jdk9-b18
+75a08df650eb3126bab0c4d15241f5886162393c jdk9-b19
--- a/common/autoconf/flags.m4 Thu Jun 19 11:22:36 2014 -0700
+++ b/common/autoconf/flags.m4 Wed Jul 05 19:46:31 2017 +0200
@@ -116,15 +116,15 @@
AC_SUBST(RC_FLAGS)
if test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
- # FIXME: likely bug, should be CCXXFLAGS_JDK? or one for C or CXX.
- CCXXFLAGS="$CCXXFLAGS -nologo"
+ # silence copyright notice and other headers.
+ COMMON_CCXXFLAGS="$COMMON_CCXXFLAGS -nologo"
fi
if test "x$SYSROOT" != "x"; then
if test "x$TOOLCHAIN_TYPE" = xsolstudio; then
if test "x$OPENJDK_TARGET_OS" = xsolaris; then
# Solaris Studio does not have a concept of sysroot. Instead we must
- # make sure the default include and lib dirs are appended to each
+ # make sure the default include and lib dirs are appended to each
# compile and link command line.
SYSROOT_CFLAGS="-I$SYSROOT/usr/include"
SYSROOT_LDFLAGS="-L$SYSROOT/usr/lib$OPENJDK_TARGET_CPU_ISADIR \
@@ -302,6 +302,7 @@
# Debug symbols
if test "x$TOOLCHAIN_TYPE" = xgcc; then
if test "x$OPENJDK_TARGET_CPU_BITS" = "x64" && test "x$DEBUG_LEVEL" = "xfastdebug"; then
+ # reduce from default "-g2" option to save space
CFLAGS_DEBUG_SYMBOLS="-g1"
CXXFLAGS_DEBUG_SYMBOLS="-g1"
else
@@ -313,6 +314,7 @@
CXXFLAGS_DEBUG_SYMBOLS="-g"
elif test "x$TOOLCHAIN_TYPE" = xsolstudio; then
CFLAGS_DEBUG_SYMBOLS="-g -xs"
+ # FIXME: likely a bug, this disables debug symbols rather than enables them
CXXFLAGS_DEBUG_SYMBOLS="-g0 -xs"
elif test "x$TOOLCHAIN_TYPE" = xxlc; then
CFLAGS_DEBUG_SYMBOLS="-g"
@@ -321,6 +323,31 @@
AC_SUBST(CFLAGS_DEBUG_SYMBOLS)
AC_SUBST(CXXFLAGS_DEBUG_SYMBOLS)
+ # bounds, memory and behavior checking options
+ if test "x$TOOLCHAIN_TYPE" = xgcc; then
+ case $DEBUG_LEVEL in
+ release )
+ # no adjustment
+ ;;
+ fastdebug )
+ # Add compile time bounds checks.
+ CFLAGS_DEBUG_OPTIONS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1"
+ CXXFLAGS_DEBUG_OPTIONS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1"
+ ;;
+ slowdebug )
+ # Add runtime bounds checks and symbol info.
+ CFLAGS_DEBUG_OPTIONS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fstack-protector-all --param ssp-buffer-size=1"
+ CXXFLAGS_DEBUG_OPTIONS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fstack-protector-all --param ssp-buffer-size=1"
+ if test "x$HAS_CFLAG_DETECT_UNDEFINED_BEHAVIOR" = "xtrue"; then
+ CFLAGS_DEBUG_OPTIONS="$CFLAGS_DEBUG_OPTIONS $CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG"
+ CXXFLAGS_DEBUG_OPTIONS="$CXXFLAGS_DEBUG_OPTIONS $CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG"
+ fi
+ ;;
+ esac
+ fi
+ AC_SUBST(CFLAGS_DEBUG_OPTIONS)
+ AC_SUBST(CXXFLAGS_DEBUG_OPTIONS)
+
# Optimization levels
if test "x$TOOLCHAIN_TYPE" = xsolstudio; then
CC_HIGHEST="$CC_HIGHEST -fns -fsimple -fsingle -xbuiltin=%all -xdepend -xrestrict -xlibmil"
@@ -330,10 +357,12 @@
C_O_FLAG_HIGHEST="-xO4 -Wu,-O4~yz $CC_HIGHEST -xalias_level=basic -xregs=no%frameptr"
C_O_FLAG_HI="-xO4 -Wu,-O4~yz -xregs=no%frameptr"
C_O_FLAG_NORM="-xO2 -Wu,-O2~yz -xregs=no%frameptr"
+ C_O_FLAG_DEBUG="-xregs=no%frameptr"
C_O_FLAG_NONE="-xregs=no%frameptr"
CXX_O_FLAG_HIGHEST="-xO4 -Qoption ube -O4~yz $CC_HIGHEST -xregs=no%frameptr"
CXX_O_FLAG_HI="-xO4 -Qoption ube -O4~yz -xregs=no%frameptr"
CXX_O_FLAG_NORM="-xO2 -Qoption ube -O2~yz -xregs=no%frameptr"
+ CXX_O_FLAG_DEBUG="-xregs=no%frameptr"
CXX_O_FLAG_NONE="-xregs=no%frameptr"
if test "x$OPENJDK_TARGET_CPU_BITS" = "x32"; then
C_O_FLAG_HIGHEST="$C_O_FLAG_HIGHEST -xchip=pentium"
@@ -343,10 +372,12 @@
C_O_FLAG_HIGHEST="-xO4 -Wc,-Qrm-s -Wc,-Qiselect-T0 $CC_HIGHEST -xalias_level=basic -xprefetch=auto,explicit -xchip=ultra"
C_O_FLAG_HI="-xO4 -Wc,-Qrm-s -Wc,-Qiselect-T0"
C_O_FLAG_NORM="-xO2 -Wc,-Qrm-s -Wc,-Qiselect-T0"
+ C_O_FLAG_DEBUG=""
C_O_FLAG_NONE=""
CXX_O_FLAG_HIGHEST="-xO4 -Qoption cg -Qrm-s -Qoption cg -Qiselect-T0 $CC_HIGHEST -xprefetch=auto,explicit -xchip=ultra"
CXX_O_FLAG_HI="-xO4 -Qoption cg -Qrm-s -Qoption cg -Qiselect-T0"
CXX_O_FLAG_NORM="-xO2 -Qoption cg -Qrm-s -Qoption cg -Qiselect-T0"
+ C_O_FLAG_DEBUG=""
CXX_O_FLAG_NONE=""
fi
else
@@ -359,13 +390,17 @@
C_O_FLAG_HIGHEST="-Os"
C_O_FLAG_HI="-Os"
C_O_FLAG_NORM="-Os"
- C_O_FLAG_NONE=""
else
C_O_FLAG_HIGHEST="-O3"
C_O_FLAG_HI="-O3"
C_O_FLAG_NORM="-O2"
- C_O_FLAG_NONE="-O0"
fi
+ if test "x$HAS_CFLAG_OPTIMIZE_DEBUG" = "xtrue"; then
+ C_O_FLAG_DEBUG="$CFLAG_OPTIMIZE_DEBUG_FLAG"
+ else
+ C_O_FLAG_DEBUG="-O0"
+ fi
+ C_O_FLAG_NONE="-O0"
elif test "x$TOOLCHAIN_TYPE" = xclang; then
if test "x$OPENJDK_TARGET_OS" = xmacosx; then
# On MacOSX we optimize for size, something
@@ -373,37 +408,63 @@
C_O_FLAG_HIGHEST="-Os"
C_O_FLAG_HI="-Os"
C_O_FLAG_NORM="-Os"
- C_O_FLAG_NONE=""
else
C_O_FLAG_HIGHEST="-O3"
C_O_FLAG_HI="-O3"
C_O_FLAG_NORM="-O2"
- C_O_FLAG_NONE="-O0"
fi
+ C_O_FLAG_DEBUG="-O0"
+ C_O_FLAG_NONE="-O0"
elif test "x$TOOLCHAIN_TYPE" = xxlc; then
C_O_FLAG_HIGHEST="-O3"
C_O_FLAG_HI="-O3 -qstrict"
C_O_FLAG_NORM="-O2"
- C_O_FLAG_NONE=""
+ C_O_FLAG_DEBUG="-qnoopt"
+ C_O_FLAG_NONE="-qnoop"
elif test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
C_O_FLAG_HIGHEST="-O2"
C_O_FLAG_HI="-O1"
C_O_FLAG_NORM="-O1"
+ C_O_FLAG_DEBUG="-Od"
C_O_FLAG_NONE="-Od"
fi
CXX_O_FLAG_HIGHEST="$C_O_FLAG_HIGHEST"
CXX_O_FLAG_HI="$C_O_FLAG_HI"
CXX_O_FLAG_NORM="$C_O_FLAG_NORM"
+ CXX_O_FLAG_DEBUG="$C_O_FLAG_DEBUG"
CXX_O_FLAG_NONE="$C_O_FLAG_NONE"
fi
+ # Adjust optimization flags according to debug level.
+ case $DEBUG_LEVEL in
+ release )
+ # no adjustment
+ ;;
+ fastdebug )
+ # Not quite so much optimization
+ C_O_FLAG_HI="$C_O_FLAG_NORM"
+ CXX_O_FLAG_HI="$CXX_O_FLAG_NORM"
+ ;;
+ slowdebug )
+ # Disable optimization
+ C_O_FLAG_HIGHEST="$C_O_FLAG_DEBUG"
+ C_O_FLAG_HI="$C_O_FLAG_DEBUG"
+ C_O_FLAG_NORM="$C_O_FLAG_DEBUG"
+ CXX_O_FLAG_HIGHEST="$CXX_O_FLAG_DEBUG"
+ CXX_O_FLAG_HI="$CXX_O_FLAG_DEBUG"
+ CXX_O_FLAG_NORM="$CXX_O_FLAG_DEBUG"
+ ;;
+ esac
+
AC_SUBST(C_O_FLAG_HIGHEST)
AC_SUBST(C_O_FLAG_HI)
AC_SUBST(C_O_FLAG_NORM)
+ AC_SUBST(C_O_FLAG_DEBUG)
AC_SUBST(C_O_FLAG_NONE)
AC_SUBST(CXX_O_FLAG_HIGHEST)
AC_SUBST(CXX_O_FLAG_HI)
AC_SUBST(CXX_O_FLAG_NORM)
+ AC_SUBST(CXX_O_FLAG_DEBUG)
AC_SUBST(CXX_O_FLAG_NONE)
])
@@ -461,11 +522,12 @@
# Later we will also have CFLAGS and LDFLAGS for the hotspot subrepo build.
#
- # Setup compiler/platform specific flags to CFLAGS_JDK,
- # CXXFLAGS_JDK and CCXXFLAGS_JDK (common to C and CXX?)
+ # Setup compiler/platform specific flags into
+ # CFLAGS_JDK - C Compiler flags
+ # CXXFLAGS_JDK - C++ Compiler flags
+ # COMMON_CCXXFLAGS_JDK - common to C and C++
if test "x$TOOLCHAIN_TYPE" = xgcc; then
- # these options are used for both C and C++ compiles
- CCXXFLAGS_JDK="$CCXXFLAGS $CCXXFLAGS_JDK -Wall -Wno-parentheses -Wextra -Wno-unused -Wno-unused-parameter -Wformat=2 \
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS $COMMON_CCXXFLAGS_JDK -Wall -Wno-parentheses -Wextra -Wno-unused -Wno-unused-parameter -Wformat=2 \
-pipe -D_GNU_SOURCE -D_REENTRANT -D_LARGEFILE64_SOURCE"
case $OPENJDK_TARGET_CPU_ARCH in
arm )
@@ -477,31 +539,31 @@
CFLAGS_JDK="${CFLAGS_JDK} -fno-strict-aliasing"
;;
* )
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -fno-omit-frame-pointer"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -fno-omit-frame-pointer"
CFLAGS_JDK="${CFLAGS_JDK} -fno-strict-aliasing"
;;
esac
elif test "x$TOOLCHAIN_TYPE" = xsolstudio; then
- CCXXFLAGS_JDK="$CCXXFLAGS $CCXXFLAGS_JDK -DTRACING -DMACRO_MEMSYS_OPS -DBREAKPTS"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS $COMMON_CCXXFLAGS_JDK -DTRACING -DMACRO_MEMSYS_OPS -DBREAKPTS"
if test "x$OPENJDK_TARGET_CPU_ARCH" = xx86; then
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DcpuIntel -Di586 -D$OPENJDK_TARGET_CPU_LEGACY_LIB"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DcpuIntel -Di586 -D$OPENJDK_TARGET_CPU_LEGACY_LIB"
CFLAGS_JDK="$CFLAGS_JDK -erroff=E_BAD_PRAGMA_PACK_VALUE"
fi
-
+
CFLAGS_JDK="$CFLAGS_JDK -xc99=%none -xCC -errshort=tags -Xa -v -mt -W0,-noglobal"
CXXFLAGS_JDK="$CXXFLAGS_JDK -errtags=yes +w -mt -features=no%except -DCC_NOEX -norunpath -xnolib"
elif test "x$TOOLCHAIN_TYPE" = xxlc; then
CFLAGS_JDK="$CFLAGS_JDK -D_GNU_SOURCE -D_REENTRANT -D_LARGEFILE64_SOURCE -DSTDC"
CXXFLAGS_JDK="$CXXFLAGS_JDK -D_GNU_SOURCE -D_REENTRANT -D_LARGEFILE64_SOURCE -DSTDC"
elif test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
- CCXXFLAGS_JDK="$CCXXFLAGS $CCXXFLAGS_JDK -Zi -MD -Zc:wchar_t- -W3 -wd4800 \
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS $COMMON_CCXXFLAGS_JDK -Zi -MD -Zc:wchar_t- -W3 -wd4800 \
-D_STATIC_CPPLIB -D_DISABLE_DEPRECATE_STATIC_CPPLIB -DWIN32_LEAN_AND_MEAN \
-D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE \
-DWIN32 -DIAL"
if test "x$OPENJDK_TARGET_CPU" = xx86_64; then
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_AMD64_ -Damd64"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_AMD64_ -Damd64"
else
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_X86_ -Dx86"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_X86_ -Dx86"
fi
fi
@@ -509,28 +571,20 @@
# Adjust flags according to debug level.
case $DEBUG_LEVEL in
- fastdebug )
- CFLAGS_JDK="$CFLAGS_JDK $CFLAGS_DEBUG_SYMBOLS"
- CXXFLAGS_JDK="$CXXFLAGS_JDK $CXXFLAGS_DEBUG_SYMBOLS"
- C_O_FLAG_HI="$C_O_FLAG_NORM"
- C_O_FLAG_NORM="$C_O_FLAG_NORM"
- CXX_O_FLAG_HI="$CXX_O_FLAG_NORM"
- CXX_O_FLAG_NORM="$CXX_O_FLAG_NORM"
+ fastdebug | slowdebug )
+ CFLAGS_JDK="$CFLAGS_JDK $CFLAGS_DEBUG_SYMBOLS $CFLAGS_DEBUG_OPTIONS"
+ CXXFLAGS_JDK="$CXXFLAGS_JDK $CXXFLAGS_DEBUG_SYMBOLS $CXXFLAGS_DEBUG_OPTIONS"
JAVAC_FLAGS="$JAVAC_FLAGS -g"
;;
- slowdebug )
- CFLAGS_JDK="$CFLAGS_JDK $CFLAGS_DEBUG_SYMBOLS"
- CXXFLAGS_JDK="$CXXFLAGS_JDK $CXXFLAGS_DEBUG_SYMBOLS"
- C_O_FLAG_HI="$C_O_FLAG_NONE"
- C_O_FLAG_NORM="$C_O_FLAG_NONE"
- CXX_O_FLAG_HI="$CXX_O_FLAG_NONE"
- CXX_O_FLAG_NORM="$CXX_O_FLAG_NONE"
- JAVAC_FLAGS="$JAVAC_FLAGS -g"
+ release )
+ ;;
+ * )
+ AC_MSG_ERROR([Unrecognized \$DEBUG_LEVEL: $DEBUG_LEVEL])
;;
esac
# Setup LP64
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK $ADD_LP64"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK $ADD_LP64"
# Set some common defines. These works for all compilers, but assume
# -D is universally accepted.
@@ -543,49 +597,49 @@
# Note: -Dmacro is the same as #define macro 1
# -Dmacro= is the same as #define macro
if test "x$OPENJDK_TARGET_OS" = xsolaris; then
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_LITTLE_ENDIAN="
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_LITTLE_ENDIAN="
else
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_LITTLE_ENDIAN"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_LITTLE_ENDIAN"
fi
else
# Same goes for _BIG_ENDIAN. Do we really need to set *ENDIAN on Solaris if they
# are defined in the system?
if test "x$OPENJDK_TARGET_OS" = xsolaris; then
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_BIG_ENDIAN="
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_BIG_ENDIAN="
else
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_BIG_ENDIAN"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_BIG_ENDIAN"
fi
fi
-
+
# Setup target OS define. Use OS target name but in upper case.
OPENJDK_TARGET_OS_UPPERCASE=`$ECHO $OPENJDK_TARGET_OS | $TR 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D$OPENJDK_TARGET_OS_UPPERCASE"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D$OPENJDK_TARGET_OS_UPPERCASE"
# Setup target CPU
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DARCH='\"$OPENJDK_TARGET_CPU_LEGACY\"' -D$OPENJDK_TARGET_CPU_LEGACY"
-
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DARCH='\"$OPENJDK_TARGET_CPU_LEGACY\"' -D$OPENJDK_TARGET_CPU_LEGACY"
+
# Setup debug/release defines
if test "x$DEBUG_LEVEL" = xrelease; then
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DNDEBUG"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DNDEBUG"
if test "x$OPENJDK_TARGET_OS" = xsolaris; then
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DTRIMMED"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DTRIMMED"
fi
else
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DDEBUG"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DDEBUG"
fi
# Setup release name
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DRELEASE='\"\$(RELEASE)\"'"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DRELEASE='\"\$(RELEASE)\"'"
# Set some additional per-OS defines.
if test "x$OPENJDK_TARGET_OS" = xmacosx; then
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_ALLBSD_SOURCE -D_DARWIN_UNLIMITED_SELECT"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_ALLBSD_SOURCE -D_DARWIN_UNLIMITED_SELECT"
elif test "x$OPENJDK_TARGET_OS" = xaix; then
# FIXME: PPC64 should not be here.
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DPPC64"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DPPC64"
elif test "x$OPENJDK_TARGET_OS" = xbsd; then
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_ALLBSD_SOURCE"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_ALLBSD_SOURCE"
fi
# Additional macosx handling
@@ -595,22 +649,22 @@
# FIXME: clean this up, and/or move it elsewhere.
# Setting these parameters makes it an error to link to macosx APIs that are
- # newer than the given OS version and makes the linked binaries compatible
+ # newer than the given OS version and makes the linked binaries compatible
# even if built on a newer version of the OS.
# The expected format is X.Y.Z
MACOSX_VERSION_MIN=10.7.0
AC_SUBST(MACOSX_VERSION_MIN)
-
+
# The macro takes the version with no dots, ex: 1070
# Let the flags variables get resolved in make for easier override on make
# command line.
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DMAC_OS_X_VERSION_MAX_ALLOWED=\$(subst .,,\$(MACOSX_VERSION_MIN)) -mmacosx-version-min=\$(MACOSX_VERSION_MIN)"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DMAC_OS_X_VERSION_MAX_ALLOWED=\$(subst .,,\$(MACOSX_VERSION_MIN)) -mmacosx-version-min=\$(MACOSX_VERSION_MIN)"
LDFLAGS_JDK="$LDFLAGS_JDK -mmacosx-version-min=\$(MACOSX_VERSION_MIN)"
fi
fi
# Setup some hard coded includes
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK \
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK \
-I${JDK_OUTPUTDIR}/include \
-I${JDK_OUTPUTDIR}/include/$OPENJDK_TARGET_OS \
-I${JDK_TOPDIR}/src/share/javavm/export \
@@ -619,12 +673,12 @@
-I${JDK_TOPDIR}/src/$OPENJDK_TARGET_OS_API_DIR/native/common"
# The shared libraries are compiled using the picflag.
- CFLAGS_JDKLIB="$CCXXFLAGS_JDK $CFLAGS_JDK $PICFLAG $CFLAGS_JDKLIB_EXTRA"
- CXXFLAGS_JDKLIB="$CCXXFLAGS_JDK $CXXFLAGS_JDK $PICFLAG $CXXFLAGS_JDKLIB_EXTRA "
+ CFLAGS_JDKLIB="$COMMON_CCXXFLAGS_JDK $CFLAGS_JDK $PICFLAG $CFLAGS_JDKLIB_EXTRA"
+ CXXFLAGS_JDKLIB="$COMMON_CCXXFLAGS_JDK $CXXFLAGS_JDK $PICFLAG $CXXFLAGS_JDKLIB_EXTRA "
# Executable flags
- CFLAGS_JDKEXE="$CCXXFLAGS_JDK $CFLAGS_JDK"
- CXXFLAGS_JDKEXE="$CCXXFLAGS_JDK $CXXFLAGS_JDK"
+ CFLAGS_JDKEXE="$COMMON_CCXXFLAGS_JDK $CFLAGS_JDK"
+ CXXFLAGS_JDKEXE="$COMMON_CCXXFLAGS_JDK $CXXFLAGS_JDK"
AC_SUBST(CFLAGS_JDKLIB)
AC_SUBST(CFLAGS_JDKEXE)
@@ -633,6 +687,7 @@
# Setup LDFLAGS et al.
#
+
# Now this is odd. The JDK native libraries have to link against libjvm.so
# On 32-bit machines there is normally two distinct libjvm.so:s, client and server.
# Which should we link to? Are we lucky enough that the binary api to the libjvm.so library
@@ -648,39 +703,93 @@
fi
# TODO: make -debug optional "--disable-full-debug-symbols"
LDFLAGS_JDK="$LDFLAGS_JDK -debug"
- LDFLAGS_JDKLIB="${LDFLAGS_JDK} -dll -libpath:${JDK_OUTPUTDIR}/lib"
- LDFLAGS_JDKLIB_SUFFIX=""
+ elif test "x$TOOLCHAIN_TYPE" = xgcc; then
+ # If this is a --hash-style=gnu system, use --hash-style=both, why?
+ # We have previously set HAS_GNU_HASH if this is the case
+ if test -n "$HAS_GNU_HASH"; then
+ LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker --hash-style=both"
+ fi
+ if test "x$OPENJDK_TARGET_OS" = xlinux; then
+ # And since we now know that the linker is gnu, then add -z defs, to forbid
+ # undefined symbols in object files.
+ LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker -z -Xlinker defs"
+ case $DEBUG_LEVEL in
+ release )
+ # tell linker to optimize libraries.
+ # Should this be supplied to the OSS linker as well?
+ LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker -O1"
+ ;;
+ slowdebug )
+ if test "x$HAS_LINKER_NOW" = "xtrue"; then
+ # do relocations at load
+ LDFLAGS_JDK="$LDFLAGS_JDK $LINKER_NOW_FLAG"
+ LDFLAGS_CXX_JDK="$LDFLAGS_CXX_JDK $LINKER_NOW_FLAG"
+ fi
+ if test "x$HAS_LINKER_RELRO" = "xtrue"; then
+ # mark relocations read only
+ LDFLAGS_JDK="$LDFLAGS_JDK $LINKER_RELRO_FLAG"
+ LDFLAGS_CXX_JDK="$LDFLAGS_CXX_JDK $LINKER_RELRO_FLAG"
+ fi
+ ;;
+ fastdebug )
+ if test "x$HAS_LINKER_RELRO" = "xtrue"; then
+ # mark relocations read only
+ LDFLAGS_JDK="$LDFLAGS_JDK $LINKER_RELRO_FLAG"
+ LDFLAGS_CXX_JDK="$LDFLAGS_CXX_JDK $LINKER_RELRO_FLAG"
+ fi
+ ;;
+ * )
+ AC_MSG_ERROR([Unrecognized \$DEBUG_LEVEL: $DEBUG_LEVEL])
+ ;;
+ esac
+ fi
+ elif test "x$TOOLCHAIN_TYPE" = xsolstudio; then
+ LDFLAGS_JDK="$LDFLAGS_JDK -z defs -xildoff -ztext"
+ LDFLAGS_CXX_JDK="$LDFLAGS_CXX_JDK -norunpath -xnolib"
+ fi
+
+ if test "x$TOOLCHAIN_TYPE" = xgcc || test "x$TOOLCHAIN_TYPE" = xclang; then
+ # If undefined behaviour detection is enabled then we need to tell linker.
+ case $DEBUG_LEVEL in
+ release | fastdebug )
+ ;;
+ slowdebug )
+ AC_MSG_WARN([$HAS_CFLAG_DETECT_UNDEFINED_BEHAVIOR])
+ if test "x$HAS_CFLAG_DETECT_UNDEFINED_BEHAVIOR" = "xtrue"; then
+ # enable undefined behaviour checking
+ LDFLAGS_JDK="$LDFLAGS_JDK `$ECHO -n $CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG | sed -e "s/[ ]*\([^ ]\+\)/ -Xlinker \1/g"`"
+ LDFLAGS_CXX_JDK="$LDFLAGS_CXX_JDK `$ECHO -n $CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG | sed -e "s/[ ]*\([^ ]\+\)/ -Xlinker \1/g"`"
+ fi
+ ;;
+ * )
+ AC_MSG_ERROR([Unrecognized \$DEBUG_LEVEL: $DEBUG_LEVEL])
+ ;;
+ esac
+ fi
+
+ # Customize LDFLAGS for executables
+
+ LDFLAGS_JDKEXE="${LDFLAGS_JDK}"
+
+ if test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
if test "x$OPENJDK_TARGET_CPU_BITS" = "x64"; then
LDFLAGS_STACK_SIZE=1048576
else
LDFLAGS_STACK_SIZE=327680
fi
- LDFLAGS_JDKEXE="${LDFLAGS_JDK} /STACK:$LDFLAGS_STACK_SIZE"
+ LDFLAGS_JDKEXE="${LDFLAGS_JDKEXE} /STACK:$LDFLAGS_STACK_SIZE"
+ elif test "x$OPENJDK_TARGET_OS" = xlinux; then
+ LDFLAGS_JDKEXE="$LDFLAGS_JDKEXE -Xlinker --allow-shlib-undefined"
+ fi
+
+ # Customize LDFLAGS for libs
+ LDFLAGS_JDKLIB="${LDFLAGS_JDK}"
+
+ if test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
+ LDFLAGS_JDKLIB="${LDFLAGS_JDKLIB} -dll -libpath:${JDK_OUTPUTDIR}/lib"
+ LDFLAGS_JDKLIB_SUFFIX=""
else
- if test "x$TOOLCHAIN_TYPE" = xgcc; then
- # If this is a --hash-style=gnu system, use --hash-style=both, why?
- # We have previously set HAS_GNU_HASH if this is the case
- if test -n "$HAS_GNU_HASH"; then
- LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker --hash-style=both "
- fi
- if test "x$OPENJDK_TARGET_OS" = xlinux; then
- # And since we now know that the linker is gnu, then add -z defs, to forbid
- # undefined symbols in object files.
- LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker -z -Xlinker defs"
- if test "x$DEBUG_LEVEL" = "xrelease"; then
- # When building release libraries, tell the linker optimize them.
- # Should this be supplied to the OSS linker as well?
- LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker -O1"
- fi
- fi
- fi
-
- if test "x$TOOLCHAIN_TYPE" = xsolstudio; then
- LDFLAGS_JDK="$LDFLAGS_JDK -z defs -xildoff -ztext"
- LDFLAGS_CXX_JDK="$LDFLAGS_CXX_JDK -norunpath -xnolib"
- fi
-
- LDFLAGS_JDKLIB="${LDFLAGS_JDK} $SHARED_LIBRARY_FLAGS \
+ LDFLAGS_JDKLIB="${LDFLAGS_JDKLIB} ${SHARED_LIBRARY_FLAGS} \
-L${JDK_OUTPUTDIR}/lib${OPENJDK_TARGET_CPU_LIBDIR}"
# On some platforms (mac) the linker warns about non existing -L dirs.
@@ -701,12 +810,8 @@
if test "x$TOOLCHAIN_TYPE" = xsolstudio; then
LDFLAGS_JDKLIB_SUFFIX="$LDFLAGS_JDKLIB_SUFFIX -lc"
fi
+ fi
- LDFLAGS_JDKEXE="${LDFLAGS_JDK}"
- if test "x$OPENJDK_TARGET_OS" = xlinux; then
- LDFLAGS_JDKEXE="$LDFLAGS_JDKEXE -Xlinker --allow-shlib-undefined"
- fi
- fi
AC_SUBST(LDFLAGS_JDKLIB)
AC_SUBST(LDFLAGS_JDKEXE)
AC_SUBST(LDFLAGS_JDKLIB_SUFFIX)
@@ -714,7 +819,6 @@
AC_SUBST(LDFLAGS_CXX_JDK)
])
-
# FLAGS_COMPILER_CHECK_ARGUMENTS([ARGUMENT], [RUN-IF-TRUE],
# [RUN-IF-FALSE])
# ------------------------------------------------------------
@@ -727,7 +831,7 @@
saved_cflags="$CFLAGS"
CFLAGS="$CFLAGS $1"
AC_LANG_PUSH([C])
- AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int i;]])], [],
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int i;]])], [],
[supports=no])
AC_LANG_POP([C])
CFLAGS="$saved_cflags"
@@ -735,7 +839,7 @@
saved_cxxflags="$CXXFLAGS"
CXXFLAGS="$CXXFLAG $1"
AC_LANG_PUSH([C++])
- AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int i;]])], [],
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int i;]])], [],
[supports=no])
AC_LANG_POP([C++])
CXXFLAGS="$saved_cxxflags"
@@ -748,6 +852,31 @@
fi
])
+# FLAGS_LINKER_CHECK_ARGUMENTS([ARGUMENT], [RUN-IF-TRUE],
+# [RUN-IF-FALSE])
+# ------------------------------------------------------------
+# Check that the linker support an argument
+AC_DEFUN([FLAGS_LINKER_CHECK_ARGUMENTS],
+[
+ AC_MSG_CHECKING([if linker supports "$1"])
+ supports=yes
+
+ saved_ldflags="$LDFLAGS"
+ LDFLAGS="$LDFLAGS $1"
+ AC_LANG_PUSH([C])
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],
+ [], [supports=no])
+ AC_LANG_POP([C])
+ LDFLAGS="$saved_ldflags"
+
+ AC_MSG_RESULT([$supports])
+ if test "x$supports" = "xyes" ; then
+ m4_ifval([$2], [$2], [:])
+ else
+ m4_ifval([$3], [$3], [:])
+ fi
+])
+
AC_DEFUN_ONCE([FLAGS_SETUP_COMPILER_FLAGS_MISC],
[
# Some Zero and Shark settings.
--- a/common/autoconf/generated-configure.sh Thu Jun 19 11:22:36 2014 -0700
+++ b/common/autoconf/generated-configure.sh Wed Jul 05 19:46:31 2017 +0200
@@ -692,13 +692,17 @@
LEGACY_EXTRA_CXXFLAGS
LEGACY_EXTRA_CFLAGS
CXX_O_FLAG_NONE
+CXX_O_FLAG_DEBUG
CXX_O_FLAG_NORM
CXX_O_FLAG_HI
CXX_O_FLAG_HIGHEST
C_O_FLAG_NONE
+C_O_FLAG_DEBUG
C_O_FLAG_NORM
C_O_FLAG_HI
C_O_FLAG_HIGHEST
+CXXFLAGS_DEBUG_OPTIONS
+CFLAGS_DEBUG_OPTIONS
CXXFLAGS_DEBUG_SYMBOLS
CFLAGS_DEBUG_SYMBOLS
CXX_FLAG_DEPS
@@ -2346,6 +2350,52 @@
} # ac_fn_objc_try_compile
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest$ac_exeext
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ test -x conftest$ac_exeext
+ }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+ # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+ # interfere with the next link command; also delete a directory that is
+ # left behind by Apple's compiler. We do this before executing the actions.
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+
# ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES
# ---------------------------------------------------------
# Tests whether HEADER exists, giving a warning if it cannot be compiled using
@@ -3761,13 +3811,18 @@
-
# FLAGS_COMPILER_CHECK_ARGUMENTS([ARGUMENT], [RUN-IF-TRUE],
# [RUN-IF-FALSE])
# ------------------------------------------------------------
# Check that the c and c++ compilers support an argument
+# FLAGS_LINKER_CHECK_ARGUMENTS([ARGUMENT], [RUN-IF-TRUE],
+# [RUN-IF-FALSE])
+# ------------------------------------------------------------
+# Check that the linker support an argument
+
+
#
@@ -4253,7 +4308,7 @@
#CUSTOM_AUTOCONF_INCLUDE
# Do not change or remove the following line, it is needed for consistency checks:
-DATE_WHEN_GENERATED=1399969244
+DATE_WHEN_GENERATED=1402614845
###############################################################################
#
@@ -40264,6 +40319,8 @@
+
+
# The package path is used only on macosx?
# FIXME: clean this up, and/or move it elsewhere.
PACKAGE_PATH=/opt/local
@@ -40289,6 +40346,242 @@
# If this is a --hash-style=gnu system, use --hash-style=both, why?
HAS_GNU_HASH=`$CC -dumpspecs 2>/dev/null | $GREP 'hash-style=gnu'`
# This is later checked when setting flags.
+
+ # "-Og" suppported for GCC 4.8 and later
+ CFLAG_OPTIMIZE_DEBUG_FLAG="-Og"
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler supports \"$CFLAG_OPTIMIZE_DEBUG_FLAG\"" >&5
+$as_echo_n "checking if compiler supports \"$CFLAG_OPTIMIZE_DEBUG_FLAG\"... " >&6; }
+ supports=yes
+
+ saved_cflags="$CFLAGS"
+ CFLAGS="$CFLAGS $CFLAG_OPTIMIZE_DEBUG_FLAG"
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+ supports=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+ CFLAGS="$saved_cflags"
+
+ saved_cxxflags="$CXXFLAGS"
+ CXXFLAGS="$CXXFLAG $CFLAG_OPTIMIZE_DEBUG_FLAG"
+ ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+int i;
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+
+else
+ supports=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+ CXXFLAGS="$saved_cxxflags"
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supports" >&5
+$as_echo "$supports" >&6; }
+ if test "x$supports" = "xyes" ; then
+ HAS_CFLAG_OPTIMIZE_DEBUG=true
+ else
+ HAS_CFLAG_OPTIMIZE_DEBUG=false
+ fi
+
+
+ # "-fsanitize=undefined" supported for GCC 4.9 and later
+ CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG="-fsanitize=undefined -fsanitize-recover"
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler supports \"$CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG\"" >&5
+$as_echo_n "checking if compiler supports \"$CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG\"... " >&6; }
+ supports=yes
+
+ saved_cflags="$CFLAGS"
+ CFLAGS="$CFLAGS $CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG"
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+ supports=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+ CFLAGS="$saved_cflags"
+
+ saved_cxxflags="$CXXFLAGS"
+ CXXFLAGS="$CXXFLAG $CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG"
+ ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+int i;
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+
+else
+ supports=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+ CXXFLAGS="$saved_cxxflags"
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supports" >&5
+$as_echo "$supports" >&6; }
+ if test "x$supports" = "xyes" ; then
+ HAS_CFLAG_DETECT_UNDEFINED_BEHAVIOR=true
+ else
+ HAS_CFLAG_DETECT_UNDEFINED_BEHAVIOR=false
+ fi
+
+
+ # "-z relro" supported in GNU binutils 2.17 and later
+ LINKER_RELRO_FLAG="-Xlinker -z -Xlinker relro"
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if linker supports \"$LINKER_RELRO_FLAG\"" >&5
+$as_echo_n "checking if linker supports \"$LINKER_RELRO_FLAG\"... " >&6; }
+ supports=yes
+
+ saved_ldflags="$LDFLAGS"
+ LDFLAGS="$LDFLAGS $LINKER_RELRO_FLAG"
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+else
+ supports=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+ LDFLAGS="$saved_ldflags"
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supports" >&5
+$as_echo "$supports" >&6; }
+ if test "x$supports" = "xyes" ; then
+ HAS_LINKER_RELRO=true
+ else
+ HAS_LINKER_RELRO=false
+ fi
+
+
+ # "-z now" supported in GNU binutils 2.11 and later
+ LINKER_NOW_FLAG="-Xlinker -z -Xlinker now"
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if linker supports \"$LINKER_NOW_FLAG\"" >&5
+$as_echo_n "checking if linker supports \"$LINKER_NOW_FLAG\"... " >&6; }
+ supports=yes
+
+ saved_ldflags="$LDFLAGS"
+ LDFLAGS="$LDFLAGS $LINKER_NOW_FLAG"
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+else
+ supports=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+ LDFLAGS="$saved_ldflags"
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supports" >&5
+$as_echo "$supports" >&6; }
+ if test "x$supports" = "xyes" ; then
+ HAS_LINKER_NOW=true
+ else
+ HAS_LINKER_NOW=false
+ fi
+
fi
# Check for broken SuSE 'ld' for which 'Only anonymous version tag is allowed
@@ -40297,8 +40590,8 @@
if test "x$OPENJDK_TARGET_OS" = xlinux && test "x$TOOLCHAIN_TYPE" = xgcc; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for broken SuSE 'ld' which only understands anonymous version tags in executables" >&5
$as_echo_n "checking for broken SuSE 'ld' which only understands anonymous version tags in executables... " >&6; }
- echo "SUNWprivate_1.1 { local: *; };" > version-script.map
- echo "int main() { }" > main.c
+ $ECHO "SUNWprivate_1.1 { local: *; };" > version-script.map
+ $ECHO "int main() { }" > main.c
if $CXX -Xlinker -version-script=version-script.map main.c 2>&5 >&5; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
@@ -40768,8 +41061,8 @@
if test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
- # FIXME: likely bug, should be CCXXFLAGS_JDK? or one for C or CXX.
- CCXXFLAGS="$CCXXFLAGS -nologo"
+ # silence copyright notice and other headers.
+ COMMON_CCXXFLAGS="$COMMON_CCXXFLAGS -nologo"
fi
if test "x$SYSROOT" != "x"; then
@@ -40803,7 +41096,6 @@
# Now we can test some aspects on the target using configure macros.
-
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
$as_echo_n "checking for ANSI C header files... " >&6; }
if ${ac_cv_header_stdc+:} false; then :
@@ -41488,6 +41780,7 @@
# Debug symbols
if test "x$TOOLCHAIN_TYPE" = xgcc; then
if test "x$OPENJDK_TARGET_CPU_BITS" = "x64" && test "x$DEBUG_LEVEL" = "xfastdebug"; then
+ # reduce from default "-g2" option to save space
CFLAGS_DEBUG_SYMBOLS="-g1"
CXXFLAGS_DEBUG_SYMBOLS="-g1"
else
@@ -41499,6 +41792,7 @@
CXXFLAGS_DEBUG_SYMBOLS="-g"
elif test "x$TOOLCHAIN_TYPE" = xsolstudio; then
CFLAGS_DEBUG_SYMBOLS="-g -xs"
+ # FIXME: likely a bug, this disables debug symbols rather than enables them
CXXFLAGS_DEBUG_SYMBOLS="-g0 -xs"
elif test "x$TOOLCHAIN_TYPE" = xxlc; then
CFLAGS_DEBUG_SYMBOLS="-g"
@@ -41507,6 +41801,31 @@
+ # bounds, memory and behavior checking options
+ if test "x$TOOLCHAIN_TYPE" = xgcc; then
+ case $DEBUG_LEVEL in
+ release )
+ # no adjustment
+ ;;
+ fastdebug )
+ # Add compile time bounds checks.
+ CFLAGS_DEBUG_OPTIONS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1"
+ CXXFLAGS_DEBUG_OPTIONS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1"
+ ;;
+ slowdebug )
+ # Add runtime bounds checks and symbol info.
+ CFLAGS_DEBUG_OPTIONS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fstack-protector-all --param ssp-buffer-size=1"
+ CXXFLAGS_DEBUG_OPTIONS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fstack-protector-all --param ssp-buffer-size=1"
+ if test "x$HAS_CFLAG_DETECT_UNDEFINED_BEHAVIOR" = "xtrue"; then
+ CFLAGS_DEBUG_OPTIONS="$CFLAGS_DEBUG_OPTIONS $CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG"
+ CXXFLAGS_DEBUG_OPTIONS="$CXXFLAGS_DEBUG_OPTIONS $CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG"
+ fi
+ ;;
+ esac
+ fi
+
+
+
# Optimization levels
if test "x$TOOLCHAIN_TYPE" = xsolstudio; then
CC_HIGHEST="$CC_HIGHEST -fns -fsimple -fsingle -xbuiltin=%all -xdepend -xrestrict -xlibmil"
@@ -41516,10 +41835,12 @@
C_O_FLAG_HIGHEST="-xO4 -Wu,-O4~yz $CC_HIGHEST -xalias_level=basic -xregs=no%frameptr"
C_O_FLAG_HI="-xO4 -Wu,-O4~yz -xregs=no%frameptr"
C_O_FLAG_NORM="-xO2 -Wu,-O2~yz -xregs=no%frameptr"
+ C_O_FLAG_DEBUG="-xregs=no%frameptr"
C_O_FLAG_NONE="-xregs=no%frameptr"
CXX_O_FLAG_HIGHEST="-xO4 -Qoption ube -O4~yz $CC_HIGHEST -xregs=no%frameptr"
CXX_O_FLAG_HI="-xO4 -Qoption ube -O4~yz -xregs=no%frameptr"
CXX_O_FLAG_NORM="-xO2 -Qoption ube -O2~yz -xregs=no%frameptr"
+ CXX_O_FLAG_DEBUG="-xregs=no%frameptr"
CXX_O_FLAG_NONE="-xregs=no%frameptr"
if test "x$OPENJDK_TARGET_CPU_BITS" = "x32"; then
C_O_FLAG_HIGHEST="$C_O_FLAG_HIGHEST -xchip=pentium"
@@ -41529,10 +41850,12 @@
C_O_FLAG_HIGHEST="-xO4 -Wc,-Qrm-s -Wc,-Qiselect-T0 $CC_HIGHEST -xalias_level=basic -xprefetch=auto,explicit -xchip=ultra"
C_O_FLAG_HI="-xO4 -Wc,-Qrm-s -Wc,-Qiselect-T0"
C_O_FLAG_NORM="-xO2 -Wc,-Qrm-s -Wc,-Qiselect-T0"
+ C_O_FLAG_DEBUG=""
C_O_FLAG_NONE=""
CXX_O_FLAG_HIGHEST="-xO4 -Qoption cg -Qrm-s -Qoption cg -Qiselect-T0 $CC_HIGHEST -xprefetch=auto,explicit -xchip=ultra"
CXX_O_FLAG_HI="-xO4 -Qoption cg -Qrm-s -Qoption cg -Qiselect-T0"
CXX_O_FLAG_NORM="-xO2 -Qoption cg -Qrm-s -Qoption cg -Qiselect-T0"
+ C_O_FLAG_DEBUG=""
CXX_O_FLAG_NONE=""
fi
else
@@ -41545,13 +41868,17 @@
C_O_FLAG_HIGHEST="-Os"
C_O_FLAG_HI="-Os"
C_O_FLAG_NORM="-Os"
- C_O_FLAG_NONE=""
else
C_O_FLAG_HIGHEST="-O3"
C_O_FLAG_HI="-O3"
C_O_FLAG_NORM="-O2"
- C_O_FLAG_NONE="-O0"
- fi
+ fi
+ if test "x$HAS_CFLAG_OPTIMIZE_DEBUG" = "xtrue"; then
+ C_O_FLAG_DEBUG="$CFLAG_OPTIMIZE_DEBUG_FLAG"
+ else
+ C_O_FLAG_DEBUG="-O0"
+ fi
+ C_O_FLAG_NONE="-O0"
elif test "x$TOOLCHAIN_TYPE" = xclang; then
if test "x$OPENJDK_TARGET_OS" = xmacosx; then
# On MacOSX we optimize for size, something
@@ -41559,30 +41886,56 @@
C_O_FLAG_HIGHEST="-Os"
C_O_FLAG_HI="-Os"
C_O_FLAG_NORM="-Os"
- C_O_FLAG_NONE=""
else
C_O_FLAG_HIGHEST="-O3"
C_O_FLAG_HI="-O3"
C_O_FLAG_NORM="-O2"
- C_O_FLAG_NONE="-O0"
- fi
+ fi
+ C_O_FLAG_DEBUG="-O0"
+ C_O_FLAG_NONE="-O0"
elif test "x$TOOLCHAIN_TYPE" = xxlc; then
C_O_FLAG_HIGHEST="-O3"
C_O_FLAG_HI="-O3 -qstrict"
C_O_FLAG_NORM="-O2"
- C_O_FLAG_NONE=""
+ C_O_FLAG_DEBUG="-qnoopt"
+ C_O_FLAG_NONE="-qnoop"
elif test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
C_O_FLAG_HIGHEST="-O2"
C_O_FLAG_HI="-O1"
C_O_FLAG_NORM="-O1"
+ C_O_FLAG_DEBUG="-Od"
C_O_FLAG_NONE="-Od"
fi
CXX_O_FLAG_HIGHEST="$C_O_FLAG_HIGHEST"
CXX_O_FLAG_HI="$C_O_FLAG_HI"
CXX_O_FLAG_NORM="$C_O_FLAG_NORM"
+ CXX_O_FLAG_DEBUG="$C_O_FLAG_DEBUG"
CXX_O_FLAG_NONE="$C_O_FLAG_NONE"
fi
+ # Adjust optimization flags according to debug level.
+ case $DEBUG_LEVEL in
+ release )
+ # no adjustment
+ ;;
+ fastdebug )
+ # Not quite so much optimization
+ C_O_FLAG_HI="$C_O_FLAG_NORM"
+ CXX_O_FLAG_HI="$CXX_O_FLAG_NORM"
+ ;;
+ slowdebug )
+ # Disable optimization
+ C_O_FLAG_HIGHEST="$C_O_FLAG_DEBUG"
+ C_O_FLAG_HI="$C_O_FLAG_DEBUG"
+ C_O_FLAG_NORM="$C_O_FLAG_DEBUG"
+ CXX_O_FLAG_HIGHEST="$CXX_O_FLAG_DEBUG"
+ CXX_O_FLAG_HI="$CXX_O_FLAG_DEBUG"
+ CXX_O_FLAG_NORM="$CXX_O_FLAG_DEBUG"
+ ;;
+ esac
+
+
+
@@ -41660,11 +42013,12 @@
# Later we will also have CFLAGS and LDFLAGS for the hotspot subrepo build.
#
- # Setup compiler/platform specific flags to CFLAGS_JDK,
- # CXXFLAGS_JDK and CCXXFLAGS_JDK (common to C and CXX?)
+ # Setup compiler/platform specific flags into
+ # CFLAGS_JDK - C Compiler flags
+ # CXXFLAGS_JDK - C++ Compiler flags
+ # COMMON_CCXXFLAGS_JDK - common to C and C++
if test "x$TOOLCHAIN_TYPE" = xgcc; then
- # these options are used for both C and C++ compiles
- CCXXFLAGS_JDK="$CCXXFLAGS $CCXXFLAGS_JDK -Wall -Wno-parentheses -Wextra -Wno-unused -Wno-unused-parameter -Wformat=2 \
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS $COMMON_CCXXFLAGS_JDK -Wall -Wno-parentheses -Wextra -Wno-unused -Wno-unused-parameter -Wformat=2 \
-pipe -D_GNU_SOURCE -D_REENTRANT -D_LARGEFILE64_SOURCE"
case $OPENJDK_TARGET_CPU_ARCH in
arm )
@@ -41676,14 +42030,14 @@
CFLAGS_JDK="${CFLAGS_JDK} -fno-strict-aliasing"
;;
* )
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -fno-omit-frame-pointer"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -fno-omit-frame-pointer"
CFLAGS_JDK="${CFLAGS_JDK} -fno-strict-aliasing"
;;
esac
elif test "x$TOOLCHAIN_TYPE" = xsolstudio; then
- CCXXFLAGS_JDK="$CCXXFLAGS $CCXXFLAGS_JDK -DTRACING -DMACRO_MEMSYS_OPS -DBREAKPTS"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS $COMMON_CCXXFLAGS_JDK -DTRACING -DMACRO_MEMSYS_OPS -DBREAKPTS"
if test "x$OPENJDK_TARGET_CPU_ARCH" = xx86; then
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DcpuIntel -Di586 -D$OPENJDK_TARGET_CPU_LEGACY_LIB"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DcpuIntel -Di586 -D$OPENJDK_TARGET_CPU_LEGACY_LIB"
CFLAGS_JDK="$CFLAGS_JDK -erroff=E_BAD_PRAGMA_PACK_VALUE"
fi
@@ -41693,14 +42047,14 @@
CFLAGS_JDK="$CFLAGS_JDK -D_GNU_SOURCE -D_REENTRANT -D_LARGEFILE64_SOURCE -DSTDC"
CXXFLAGS_JDK="$CXXFLAGS_JDK -D_GNU_SOURCE -D_REENTRANT -D_LARGEFILE64_SOURCE -DSTDC"
elif test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
- CCXXFLAGS_JDK="$CCXXFLAGS $CCXXFLAGS_JDK -Zi -MD -Zc:wchar_t- -W3 -wd4800 \
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS $COMMON_CCXXFLAGS_JDK -Zi -MD -Zc:wchar_t- -W3 -wd4800 \
-D_STATIC_CPPLIB -D_DISABLE_DEPRECATE_STATIC_CPPLIB -DWIN32_LEAN_AND_MEAN \
-D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE \
-DWIN32 -DIAL"
if test "x$OPENJDK_TARGET_CPU" = xx86_64; then
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_AMD64_ -Damd64"
- else
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_X86_ -Dx86"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_AMD64_ -Damd64"
+ else
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_X86_ -Dx86"
fi
fi
@@ -41708,28 +42062,20 @@
# Adjust flags according to debug level.
case $DEBUG_LEVEL in
- fastdebug )
- CFLAGS_JDK="$CFLAGS_JDK $CFLAGS_DEBUG_SYMBOLS"
- CXXFLAGS_JDK="$CXXFLAGS_JDK $CXXFLAGS_DEBUG_SYMBOLS"
- C_O_FLAG_HI="$C_O_FLAG_NORM"
- C_O_FLAG_NORM="$C_O_FLAG_NORM"
- CXX_O_FLAG_HI="$CXX_O_FLAG_NORM"
- CXX_O_FLAG_NORM="$CXX_O_FLAG_NORM"
+ fastdebug | slowdebug )
+ CFLAGS_JDK="$CFLAGS_JDK $CFLAGS_DEBUG_SYMBOLS $CFLAGS_DEBUG_OPTIONS"
+ CXXFLAGS_JDK="$CXXFLAGS_JDK $CXXFLAGS_DEBUG_SYMBOLS $CXXFLAGS_DEBUG_OPTIONS"
JAVAC_FLAGS="$JAVAC_FLAGS -g"
;;
- slowdebug )
- CFLAGS_JDK="$CFLAGS_JDK $CFLAGS_DEBUG_SYMBOLS"
- CXXFLAGS_JDK="$CXXFLAGS_JDK $CXXFLAGS_DEBUG_SYMBOLS"
- C_O_FLAG_HI="$C_O_FLAG_NONE"
- C_O_FLAG_NORM="$C_O_FLAG_NONE"
- CXX_O_FLAG_HI="$CXX_O_FLAG_NONE"
- CXX_O_FLAG_NORM="$CXX_O_FLAG_NONE"
- JAVAC_FLAGS="$JAVAC_FLAGS -g"
+ release )
+ ;;
+ * )
+ as_fn_error $? "Unrecognized \$DEBUG_LEVEL: $DEBUG_LEVEL" "$LINENO" 5
;;
esac
# Setup LP64
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK $ADD_LP64"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK $ADD_LP64"
# Set some common defines. These works for all compilers, but assume
# -D is universally accepted.
@@ -41742,49 +42088,49 @@
# Note: -Dmacro is the same as #define macro 1
# -Dmacro= is the same as #define macro
if test "x$OPENJDK_TARGET_OS" = xsolaris; then
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_LITTLE_ENDIAN="
- else
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_LITTLE_ENDIAN"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_LITTLE_ENDIAN="
+ else
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_LITTLE_ENDIAN"
fi
else
# Same goes for _BIG_ENDIAN. Do we really need to set *ENDIAN on Solaris if they
# are defined in the system?
if test "x$OPENJDK_TARGET_OS" = xsolaris; then
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_BIG_ENDIAN="
- else
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_BIG_ENDIAN"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_BIG_ENDIAN="
+ else
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_BIG_ENDIAN"
fi
fi
# Setup target OS define. Use OS target name but in upper case.
OPENJDK_TARGET_OS_UPPERCASE=`$ECHO $OPENJDK_TARGET_OS | $TR 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D$OPENJDK_TARGET_OS_UPPERCASE"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D$OPENJDK_TARGET_OS_UPPERCASE"
# Setup target CPU
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DARCH='\"$OPENJDK_TARGET_CPU_LEGACY\"' -D$OPENJDK_TARGET_CPU_LEGACY"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DARCH='\"$OPENJDK_TARGET_CPU_LEGACY\"' -D$OPENJDK_TARGET_CPU_LEGACY"
# Setup debug/release defines
if test "x$DEBUG_LEVEL" = xrelease; then
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DNDEBUG"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DNDEBUG"
if test "x$OPENJDK_TARGET_OS" = xsolaris; then
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DTRIMMED"
- fi
- else
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DDEBUG"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DTRIMMED"
+ fi
+ else
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DDEBUG"
fi
# Setup release name
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DRELEASE='\"\$(RELEASE)\"'"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DRELEASE='\"\$(RELEASE)\"'"
# Set some additional per-OS defines.
if test "x$OPENJDK_TARGET_OS" = xmacosx; then
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_ALLBSD_SOURCE -D_DARWIN_UNLIMITED_SELECT"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_ALLBSD_SOURCE -D_DARWIN_UNLIMITED_SELECT"
elif test "x$OPENJDK_TARGET_OS" = xaix; then
# FIXME: PPC64 should not be here.
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DPPC64"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DPPC64"
elif test "x$OPENJDK_TARGET_OS" = xbsd; then
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_ALLBSD_SOURCE"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_ALLBSD_SOURCE"
fi
# Additional macosx handling
@@ -41803,13 +42149,13 @@
# The macro takes the version with no dots, ex: 1070
# Let the flags variables get resolved in make for easier override on make
# command line.
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DMAC_OS_X_VERSION_MAX_ALLOWED=\$(subst .,,\$(MACOSX_VERSION_MIN)) -mmacosx-version-min=\$(MACOSX_VERSION_MIN)"
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DMAC_OS_X_VERSION_MAX_ALLOWED=\$(subst .,,\$(MACOSX_VERSION_MIN)) -mmacosx-version-min=\$(MACOSX_VERSION_MIN)"
LDFLAGS_JDK="$LDFLAGS_JDK -mmacosx-version-min=\$(MACOSX_VERSION_MIN)"
fi
fi
# Setup some hard coded includes
- CCXXFLAGS_JDK="$CCXXFLAGS_JDK \
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK \
-I${JDK_OUTPUTDIR}/include \
-I${JDK_OUTPUTDIR}/include/$OPENJDK_TARGET_OS \
-I${JDK_TOPDIR}/src/share/javavm/export \
@@ -41818,12 +42164,12 @@
-I${JDK_TOPDIR}/src/$OPENJDK_TARGET_OS_API_DIR/native/common"
# The shared libraries are compiled using the picflag.
- CFLAGS_JDKLIB="$CCXXFLAGS_JDK $CFLAGS_JDK $PICFLAG $CFLAGS_JDKLIB_EXTRA"
- CXXFLAGS_JDKLIB="$CCXXFLAGS_JDK $CXXFLAGS_JDK $PICFLAG $CXXFLAGS_JDKLIB_EXTRA "
+ CFLAGS_JDKLIB="$COMMON_CCXXFLAGS_JDK $CFLAGS_JDK $PICFLAG $CFLAGS_JDKLIB_EXTRA"
+ CXXFLAGS_JDKLIB="$COMMON_CCXXFLAGS_JDK $CXXFLAGS_JDK $PICFLAG $CXXFLAGS_JDKLIB_EXTRA "
# Executable flags
- CFLAGS_JDKEXE="$CCXXFLAGS_JDK $CFLAGS_JDK"
- CXXFLAGS_JDKEXE="$CCXXFLAGS_JDK $CXXFLAGS_JDK"
+ CFLAGS_JDKEXE="$COMMON_CCXXFLAGS_JDK $CFLAGS_JDK"
+ CXXFLAGS_JDKEXE="$COMMON_CCXXFLAGS_JDK $CXXFLAGS_JDK"
@@ -41832,6 +42178,7 @@
# Setup LDFLAGS et al.
#
+
# Now this is odd. The JDK native libraries have to link against libjvm.so
# On 32-bit machines there is normally two distinct libjvm.so:s, client and server.
# Which should we link to? Are we lucky enough that the binary api to the libjvm.so library
@@ -41847,39 +42194,94 @@
fi
# TODO: make -debug optional "--disable-full-debug-symbols"
LDFLAGS_JDK="$LDFLAGS_JDK -debug"
- LDFLAGS_JDKLIB="${LDFLAGS_JDK} -dll -libpath:${JDK_OUTPUTDIR}/lib"
- LDFLAGS_JDKLIB_SUFFIX=""
+ elif test "x$TOOLCHAIN_TYPE" = xgcc; then
+ # If this is a --hash-style=gnu system, use --hash-style=both, why?
+ # We have previously set HAS_GNU_HASH if this is the case
+ if test -n "$HAS_GNU_HASH"; then
+ LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker --hash-style=both"
+ fi
+ if test "x$OPENJDK_TARGET_OS" = xlinux; then
+ # And since we now know that the linker is gnu, then add -z defs, to forbid
+ # undefined symbols in object files.
+ LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker -z -Xlinker defs"
+ case $DEBUG_LEVEL in
+ release )
+ # tell linker to optimize libraries.
+ # Should this be supplied to the OSS linker as well?
+ LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker -O1"
+ ;;
+ slowdebug )
+ if test "x$HAS_LINKER_NOW" = "xtrue"; then
+ # do relocations at load
+ LDFLAGS_JDK="$LDFLAGS_JDK $LINKER_NOW_FLAG"
+ LDFLAGS_CXX_JDK="$LDFLAGS_CXX_JDK $LINKER_NOW_FLAG"
+ fi
+ if test "x$HAS_LINKER_RELRO" = "xtrue"; then
+ # mark relocations read only
+ LDFLAGS_JDK="$LDFLAGS_JDK $LINKER_RELRO_FLAG"
+ LDFLAGS_CXX_JDK="$LDFLAGS_CXX_JDK $LINKER_RELRO_FLAG"
+ fi
+ ;;
+ fastdebug )
+ if test "x$HAS_LINKER_RELRO" = "xtrue"; then
+ # mark relocations read only
+ LDFLAGS_JDK="$LDFLAGS_JDK $LINKER_RELRO_FLAG"
+ LDFLAGS_CXX_JDK="$LDFLAGS_CXX_JDK $LINKER_RELRO_FLAG"
+ fi
+ ;;
+ * )
+ as_fn_error $? "Unrecognized \$DEBUG_LEVEL: $DEBUG_LEVEL" "$LINENO" 5
+ ;;
+ esac
+ fi
+ elif test "x$TOOLCHAIN_TYPE" = xsolstudio; then
+ LDFLAGS_JDK="$LDFLAGS_JDK -z defs -xildoff -ztext"
+ LDFLAGS_CXX_JDK="$LDFLAGS_CXX_JDK -norunpath -xnolib"
+ fi
+
+ if test "x$TOOLCHAIN_TYPE" = xgcc || test "x$TOOLCHAIN_TYPE" = xclang; then
+ # If undefined behaviour detection is enabled then we need to tell linker.
+ case $DEBUG_LEVEL in
+ release | fastdebug )
+ ;;
+ slowdebug )
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $HAS_CFLAG_DETECT_UNDEFINED_BEHAVIOR" >&5
+$as_echo "$as_me: WARNING: $HAS_CFLAG_DETECT_UNDEFINED_BEHAVIOR" >&2;}
+ if test "x$HAS_CFLAG_DETECT_UNDEFINED_BEHAVIOR" = "xtrue"; then
+ # enable undefined behaviour checking
+ LDFLAGS_JDK="$LDFLAGS_JDK `$ECHO -n $CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG | sed -e "s/ *\(^ \+\)/ -Xlinker \1/g"`"
+ LDFLAGS_CXX_JDK="$LDFLAGS_CXX_JDK `$ECHO -n $CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG | sed -e "s/ *\(^ \+\)/ -Xlinker \1/g"`"
+ fi
+ ;;
+ * )
+ as_fn_error $? "Unrecognized \$DEBUG_LEVEL: $DEBUG_LEVEL" "$LINENO" 5
+ ;;
+ esac
+ fi
+
+ # Customize LDFLAGS for executables
+
+ LDFLAGS_JDKEXE="${LDFLAGS_JDK}"
+
+ if test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
if test "x$OPENJDK_TARGET_CPU_BITS" = "x64"; then
LDFLAGS_STACK_SIZE=1048576
else
LDFLAGS_STACK_SIZE=327680
fi
- LDFLAGS_JDKEXE="${LDFLAGS_JDK} /STACK:$LDFLAGS_STACK_SIZE"
- else
- if test "x$TOOLCHAIN_TYPE" = xgcc; then
- # If this is a --hash-style=gnu system, use --hash-style=both, why?
- # We have previously set HAS_GNU_HASH if this is the case
- if test -n "$HAS_GNU_HASH"; then
- LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker --hash-style=both "
- fi
- if test "x$OPENJDK_TARGET_OS" = xlinux; then
- # And since we now know that the linker is gnu, then add -z defs, to forbid
- # undefined symbols in object files.
- LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker -z -Xlinker defs"
- if test "x$DEBUG_LEVEL" = "xrelease"; then
- # When building release libraries, tell the linker optimize them.
- # Should this be supplied to the OSS linker as well?
- LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker -O1"
- fi
- fi
- fi
-
- if test "x$TOOLCHAIN_TYPE" = xsolstudio; then
- LDFLAGS_JDK="$LDFLAGS_JDK -z defs -xildoff -ztext"
- LDFLAGS_CXX_JDK="$LDFLAGS_CXX_JDK -norunpath -xnolib"
- fi
-
- LDFLAGS_JDKLIB="${LDFLAGS_JDK} $SHARED_LIBRARY_FLAGS \
+ LDFLAGS_JDKEXE="${LDFLAGS_JDKEXE} /STACK:$LDFLAGS_STACK_SIZE"
+ elif test "x$OPENJDK_TARGET_OS" = xlinux; then
+ LDFLAGS_JDKEXE="$LDFLAGS_JDKEXE -Xlinker --allow-shlib-undefined"
+ fi
+
+ # Customize LDFLAGS for libs
+ LDFLAGS_JDKLIB="${LDFLAGS_JDK}"
+
+ if test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
+ LDFLAGS_JDKLIB="${LDFLAGS_JDKLIB} -dll -libpath:${JDK_OUTPUTDIR}/lib"
+ LDFLAGS_JDKLIB_SUFFIX=""
+ else
+ LDFLAGS_JDKLIB="${LDFLAGS_JDKLIB} ${SHARED_LIBRARY_FLAGS} \
-L${JDK_OUTPUTDIR}/lib${OPENJDK_TARGET_CPU_LIBDIR}"
# On some platforms (mac) the linker warns about non existing -L dirs.
@@ -41900,11 +42302,6 @@
if test "x$TOOLCHAIN_TYPE" = xsolstudio; then
LDFLAGS_JDKLIB_SUFFIX="$LDFLAGS_JDKLIB_SUFFIX -lc"
fi
-
- LDFLAGS_JDKEXE="${LDFLAGS_JDK}"
- if test "x$OPENJDK_TARGET_OS" = xlinux; then
- LDFLAGS_JDKEXE="$LDFLAGS_JDKEXE -Xlinker --allow-shlib-undefined"
- fi
fi
--- a/common/autoconf/toolchain.m4 Thu Jun 19 11:22:36 2014 -0700
+++ b/common/autoconf/toolchain.m4 Wed Jul 05 19:46:31 2017 +0200
@@ -24,11 +24,11 @@
#
########################################################################
-# This file is responsible for detecting, verifying and setting up the
-# toolchain, i.e. the compiler, linker and related utilities. It will setup
+# This file is responsible for detecting, verifying and setting up the
+# toolchain, i.e. the compiler, linker and related utilities. It will setup
# proper paths to the binaries, but it will not setup any flags.
#
-# The binaries used is determined by the toolchain type, which is the family of
+# The binaries used is determined by the toolchain type, which is the family of
# compilers and related tools that are used.
########################################################################
@@ -83,7 +83,7 @@
AC_SUBST(SHARED_LIBRARY)
AC_SUBST(STATIC_LIBRARY)
AC_SUBST(OBJ_SUFFIX)
- AC_SUBST(EXE_SUFFIX)
+ AC_SUBST(EXE_SUFFIX)
])
# Determine which toolchain type to use, and make sure it is valid for this
@@ -117,7 +117,7 @@
# First toolchain type in the list is the default
DEFAULT_TOOLCHAIN=${VALID_TOOLCHAINS%% *}
fi
-
+
if test "x$with_toolchain_type" = xlist; then
# List all toolchains
AC_MSG_NOTICE([The following toolchains are valid on this platform:])
@@ -126,7 +126,7 @@
TOOLCHAIN_DESCRIPTION=${!toolchain_var_name}
$PRINTF " %-10s %s\n" $toolchain "$TOOLCHAIN_DESCRIPTION"
done
-
+
exit 0
elif test "x$with_toolchain_type" != x; then
# User override; check that it is valid
@@ -168,10 +168,10 @@
AC_MSG_NOTICE([Using default toolchain $TOOLCHAIN_TYPE ($TOOLCHAIN_DESCRIPTION)])
else
AC_MSG_NOTICE([Using user selected toolchain $TOOLCHAIN_TYPE ($TOOLCHAIN_DESCRIPTION). Default toolchain is $DEFAULT_TOOLCHAIN.])
- fi
+ fi
])
-# Before we start detecting the toolchain executables, we might need some
+# Before we start detecting the toolchain executables, we might need some
# special setup, e.g. additional paths etc.
AC_DEFUN_ONCE([TOOLCHAIN_PRE_DETECTION],
[
@@ -184,7 +184,7 @@
ORG_OBJCFLAGS="$OBJCFLAGS"
# On Windows, we need to detect the visual studio installation first.
- # This will change the PATH, but we need to keep that new PATH even
+ # This will change the PATH, but we need to keep that new PATH even
# after toolchain detection is done, since the compiler (on x86) uses
# it for DLL resolution in runtime.
if test "x$OPENJDK_BUILD_OS" = "xwindows" && test "x$TOOLCHAIN_TYPE" = "xmicrosoft"; then
@@ -208,7 +208,7 @@
PATH="/usr/ccs/bin:$PATH"
fi
- # Finally add TOOLCHAIN_PATH at the beginning, to allow --with-tools-dir to
+ # Finally add TOOLCHAIN_PATH at the beginning, to allow --with-tools-dir to
# override all other locations.
if test "x$TOOLCHAIN_PATH" != x; then
PATH=$TOOLCHAIN_PATH:$PATH
@@ -254,7 +254,7 @@
AC_MSG_NOTICE([The result from running with --version was: "$ALT_VERSION_OUTPUT"])
AC_MSG_ERROR([A $TOOLCHAIN_TYPE compiler is required. Try setting --with-tools-dir.])
fi
- # Remove usage instructions (if present), and
+ # Remove usage instructions (if present), and
# collapse compiler output into a single line
COMPILER_VERSION_STRING=`$ECHO $COMPILER_VERSION_OUTPUT | \
$SED -e 's/ *@<:@Uu@:>@sage:.*//'`
@@ -282,7 +282,7 @@
# There is no specific version flag, but all output starts with a version string.
# First line typically looks something like:
# Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.40219.01 for 80x86
- COMPILER_VERSION_OUTPUT=`$COMPILER 2>&1 | $HEAD -n 1 | $TR -d '\r'`
+ COMPILER_VERSION_OUTPUT=`$COMPILER 2>&1 | $HEAD -n 1 | $TR -d '\r'`
# Check that this is likely to be Microsoft CL.EXE.
$ECHO "$COMPILER_VERSION_OUTPUT" | $GREP "Microsoft.*Compiler" > /dev/null
if test $? -ne 0; then
@@ -360,7 +360,7 @@
AC_MSG_NOTICE([Will use user supplied compiler $1=[$]$1])
if test "x`basename [$]$1`" = "x[$]$1"; then
# A command without a complete path is provided, search $PATH.
-
+
AC_PATH_PROGS(POTENTIAL_$1, [$]$1)
if test "x$POTENTIAL_$1" != x; then
$1=$POTENTIAL_$1
@@ -375,12 +375,12 @@
fi
else
# No user supplied value. Locate compiler ourselves.
-
+
# If we are cross compiling, assume cross compilation tools follows the
# cross compilation standard where they are prefixed with the autoconf
- # standard name for the target. For example the binary
+ # standard name for the target. For example the binary
# i686-sun-solaris2.10-gcc will cross compile for i686-sun-solaris2.10.
- # If we are not cross compiling, then the default compiler name will be
+ # If we are not cross compiling, then the default compiler name will be
# used.
$1=
@@ -450,9 +450,9 @@
TOOLCHAIN_CHECK_COMPILER_VERSION([$1], [$COMPILER_NAME])
])
-# Detect the core components of the toolchain, i.e. the compilers (CC and CXX),
-# preprocessor (CPP and CXXCPP), the linker (LD), the assembler (AS) and the
-# archiver (AR). Verify that the compilers are correct according to the
+# Detect the core components of the toolchain, i.e. the compilers (CC and CXX),
+# preprocessor (CPP and CXXCPP), the linker (LD), the assembler (AS) and the
+# archiver (AR). Verify that the compilers are correct according to the
# toolchain type.
AC_DEFUN_ONCE([TOOLCHAIN_DETECT_TOOLCHAIN_CORE],
[
@@ -529,7 +529,7 @@
])
# Setup additional tools that is considered a part of the toolchain, but not the
-# core part. Many of these are highly platform-specific and do not exist,
+# core part. Many of these are highly platform-specific and do not exist,
# and/or are not needed on all platforms.
AC_DEFUN_ONCE([TOOLCHAIN_DETECT_TOOLCHAIN_EXTRA],
[
@@ -551,7 +551,7 @@
AC_CHECK_PROG([DUMPBIN], [dumpbin], [dumpbin],,,)
BASIC_FIXUP_EXECUTABLE(DUMPBIN)
fi
-
+
if test "x$OPENJDK_TARGET_OS" = xsolaris; then
BASIC_PATH_PROGS(STRIP, strip)
BASIC_FIXUP_EXECUTABLE(STRIP)
@@ -559,7 +559,7 @@
BASIC_FIXUP_EXECUTABLE(NM)
BASIC_PATH_PROGS(GNM, gnm)
BASIC_FIXUP_EXECUTABLE(GNM)
-
+
BASIC_PATH_PROGS(MCS, mcs)
BASIC_FIXUP_EXECUTABLE(MCS)
elif test "x$OPENJDK_TARGET_OS" != xwindows; then
@@ -592,17 +592,17 @@
# Setup the build tools (i.e, the compiler and linker used to build programs
# that should be run on the build platform, not the target platform, as a build
-# helper). Since the non-cross-compile case uses the normal, target compilers
+# helper). Since the non-cross-compile case uses the normal, target compilers
# for this, we can only do this after these have been setup.
AC_DEFUN_ONCE([TOOLCHAIN_SETUP_BUILD_COMPILERS],
-[
+[
if test "x$COMPILE_TYPE" = "xcross"; then
# Now we need to find a C/C++ compiler that can build executables for the
# build platform. We can't use the AC_PROG_CC macro, since it can only be
# used once. Also, we need to do this without adding a tools dir to the
# path, otherwise we might pick up cross-compilers which don't use standard
# naming.
-
+
# FIXME: we should list the discovered compilers as an exclude pattern!
# If we do that, we can do this detection before POST_DETECTION, and still
# find the build compilers in the tools dir, if needed.
@@ -690,15 +690,39 @@
# If this is a --hash-style=gnu system, use --hash-style=both, why?
HAS_GNU_HASH=`$CC -dumpspecs 2>/dev/null | $GREP 'hash-style=gnu'`
# This is later checked when setting flags.
+
+ # "-Og" suppported for GCC 4.8 and later
+ CFLAG_OPTIMIZE_DEBUG_FLAG="-Og"
+ FLAGS_COMPILER_CHECK_ARGUMENTS([$CFLAG_OPTIMIZE_DEBUG_FLAG],
+ [HAS_CFLAG_OPTIMIZE_DEBUG=true],
+ [HAS_CFLAG_OPTIMIZE_DEBUG=false])
+
+ # "-fsanitize=undefined" supported for GCC 4.9 and later
+ CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG="-fsanitize=undefined -fsanitize-recover"
+ FLAGS_COMPILER_CHECK_ARGUMENTS([$CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG],
+ [HAS_CFLAG_DETECT_UNDEFINED_BEHAVIOR=true],
+ [HAS_CFLAG_DETECT_UNDEFINED_BEHAVIOR=false])
+
+ # "-z relro" supported in GNU binutils 2.17 and later
+ LINKER_RELRO_FLAG="-Xlinker -z -Xlinker relro"
+ FLAGS_LINKER_CHECK_ARGUMENTS([$LINKER_RELRO_FLAG],
+ [HAS_LINKER_RELRO=true],
+ [HAS_LINKER_RELRO=false])
+
+ # "-z now" supported in GNU binutils 2.11 and later
+ LINKER_NOW_FLAG="-Xlinker -z -Xlinker now"
+ FLAGS_LINKER_CHECK_ARGUMENTS([$LINKER_NOW_FLAG],
+ [HAS_LINKER_NOW=true],
+ [HAS_LINKER_NOW=false])
fi
- # Check for broken SuSE 'ld' for which 'Only anonymous version tag is allowed
+ # Check for broken SuSE 'ld' for which 'Only anonymous version tag is allowed
# in executable.'
USING_BROKEN_SUSE_LD=no
if test "x$OPENJDK_TARGET_OS" = xlinux && test "x$TOOLCHAIN_TYPE" = xgcc; then
AC_MSG_CHECKING([for broken SuSE 'ld' which only understands anonymous version tags in executables])
- echo "SUNWprivate_1.1 { local: *; };" > version-script.map
- echo "int main() { }" > main.c
+ $ECHO "SUNWprivate_1.1 { local: *; };" > version-script.map
+ $ECHO "int main() { }" > main.c
if $CXX -Xlinker -version-script=version-script.map main.c 2>&AS_MESSAGE_LOG_FD >&AS_MESSAGE_LOG_FD; then
AC_MSG_RESULT(no)
USING_BROKEN_SUSE_LD=no
--- a/corba/.hgtags Thu Jun 19 11:22:36 2014 -0700
+++ b/corba/.hgtags Wed Jul 05 19:46:31 2017 +0200
@@ -261,3 +261,4 @@
422ef9d29d84f571453f015c4cb8713c3af70ee4 jdk9-b16
4c75c2ca7cf3e0618315879acf17f42c8fcd0c09 jdk9-b17
77565aaaa2bb814e94817e92d680168052a25395 jdk9-b18
+eecc1b6adc7e193d00a0641eb0963add5a4c06e8 jdk9-b19
--- a/hotspot/.hgtags Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/.hgtags Wed Jul 05 19:46:31 2017 +0200
@@ -421,3 +421,4 @@
b14e7c0b7d3ec04127f565cda1d84122e205680c jdk9-b16
14b656df31c2cb09c505921061e79977823de71a jdk9-b17
871fd128548480095e0dc3fc34c422666baeec75 jdk9-b18
+d4cffb3ae6213c66c7522ebffe0349360a45f0ef jdk9-b19
--- a/hotspot/make/bsd/makefiles/fastdebug.make Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/make/bsd/makefiles/fastdebug.make Wed Jul 05 19:46:31 2017 +0200
@@ -24,37 +24,30 @@
# Sets make macros for making debug version of VM
+# Compiler specific DEBUG_CFLAGS are passed in from gcc.make, sparcWorks.make
+# They may also specify FASTDEBUG_CFLAGS, but it defaults to DEBUG_CFLAGS.
+
+FASTDEBUG_CFLAGS$(FASTDEBUG_CFLAGS) = $(DEBUG_CFLAGS)
+
# Compiler specific OPT_CFLAGS are passed in from gcc.make, sparcWorks.make
OPT_CFLAGS/DEFAULT= $(OPT_CFLAGS)
OPT_CFLAGS/BYFILE = $(OPT_CFLAGS/$@)$(OPT_CFLAGS/DEFAULT$(OPT_CFLAGS/$@))
# (OPT_CFLAGS/SLOWER is also available, to alter compilation of buggy files)
-ifeq ($(BUILDARCH), ia64)
- # Bug in GCC, causes hang. -O1 will override the -O3 specified earlier
- OPT_CFLAGS/callGenerator.o += -O1
- OPT_CFLAGS/ciTypeFlow.o += -O1
- OPT_CFLAGS/compile.o += -O1
- OPT_CFLAGS/concurrentMarkSweepGeneration.o += -O1
- OPT_CFLAGS/doCall.o += -O1
- OPT_CFLAGS/generateOopMap.o += -O1
- OPT_CFLAGS/generateOptoStub.o += -O1
- OPT_CFLAGS/graphKit.o += -O1
- OPT_CFLAGS/instanceKlass.o += -O1
- OPT_CFLAGS/interpreterRT_ia64.o += -O1
- OPT_CFLAGS/output.o += -O1
- OPT_CFLAGS/parse1.o += -O1
- OPT_CFLAGS/runtime.o += -O1
- OPT_CFLAGS/synchronizer.o += -O1
-endif
-
-
# If you set HOTSPARC_GENERIC=yes, you disable all OPT_CFLAGS settings
CFLAGS$(HOTSPARC_GENERIC) += $(OPT_CFLAGS/BYFILE)
# Set the environment variable HOTSPARC_GENERIC to "true"
# to inhibit the effect of the previous line on CFLAGS.
+# The following lines are copied from debug.make, except that we
+# consult FASTDEBUG_CFLAGS instead of DEBUG_CFLAGS.
+# Compiler specific DEBUG_CFLAGS are passed in from gcc.make, sparcWorks.make
+DEBUG_CFLAGS/DEFAULT= $(FASTDEBUG_CFLAGS)
+DEBUG_CFLAGS/BYFILE = $(DEBUG_CFLAGS/$@)$(DEBUG_CFLAGS/DEFAULT$(DEBUG_CFLAGS/$@))
+CFLAGS += $(DEBUG_CFLAGS/BYFILE)
+
# Linker mapfile
MAPFILE = $(GAMMADIR)/make/bsd/makefiles/mapfile-vers-debug
ifeq ($(OS_VENDOR), Darwin)
--- a/hotspot/make/bsd/makefiles/gcc.make Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/make/bsd/makefiles/gcc.make Wed Jul 05 19:46:31 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.
-#
+#
#
OS_VENDOR = $(shell uname -s)
@@ -80,7 +80,7 @@
HOSTCC = $(CC)
endif
- AS = $(CC) -c
+ AS = $(CC) -c
endif
ifeq ($(OS_VENDOR), Darwin)
@@ -100,7 +100,7 @@
endif
ifeq ($(USE_CLANG), true)
- # clang has precompiled headers support by default, but the user can switch
+ # Clang has precompiled headers support by default, but the user can switch
# it off by using 'USE_PRECOMPILED_HEADER=0'.
ifdef LP64
ifeq ($(USE_PRECOMPILED_HEADER),)
@@ -112,29 +112,29 @@
# Clang produces an error if the PCH file was compiled with other options than the actual compilation unit.
USE_PRECOMPILED_HEADER=0
endif
-
+
ifeq ($(USE_PRECOMPILED_HEADER),1)
-
+
ifndef LP64
$(error " Precompiled Headers only supported on 64-bit platforms!")
endif
-
+
PRECOMPILED_HEADER_DIR=.
PRECOMPILED_HEADER_SRC=$(GAMMADIR)/src/share/vm/precompiled/precompiled.hpp
PRECOMPILED_HEADER=$(PRECOMPILED_HEADER_DIR)/precompiled.hpp.pch
-
+
PCH_FLAG = -include precompiled.hpp
PCH_FLAG/DEFAULT = $(PCH_FLAG)
PCH_FLAG/NO_PCH = -DNO_PCH
PCH_FLAG/BY_FILE = $(PCH_FLAG/$@)$(PCH_FLAG/DEFAULT$(PCH_FLAG/$@))
-
+
VM_PCH_FLAG/LIBJVM = $(PCH_FLAG/BY_FILE)
VM_PCH_FLAG/AOUT =
VM_PCH_FLAG = $(VM_PCH_FLAG/$(LINK_INTO))
-
+
# We only use precompiled headers for the JVM build
CFLAGS += $(VM_PCH_FLAG)
-
+
# The following files are compiled at various optimization
# levels due to optimization issues encountered at the
# 'OPT_CFLAGS_DEFAULT' level. The Clang compiler issues a compile
@@ -149,7 +149,7 @@
PCH_FLAG/sharedRuntimeTrig.o = $(PCH_FLAG/NO_PCH)
PCH_FLAG/sharedRuntimeTrans.o = $(PCH_FLAG/NO_PCH)
PCH_FLAG/unsafe.o = $(PCH_FLAG/NO_PCH)
-
+
endif
else # ($(USE_CLANG), true)
# check for precompiled headers support
@@ -272,21 +272,24 @@
CFLAGS_WARN/DEFAULT = $(WARNINGS_ARE_ERRORS) $(WARNING_FLAGS)
# Special cases
-CFLAGS_WARN/BYFILE = $(CFLAGS_WARN/$@)$(CFLAGS_WARN/DEFAULT$(CFLAGS_WARN/$@))
+CFLAGS_WARN/BYFILE = $(CFLAGS_WARN/$@)$(CFLAGS_WARN/DEFAULT$(CFLAGS_WARN/$@))
# XXXDARWIN: for _dyld_bind_fully_image_containing_address
ifeq ($(OS_VENDOR), Darwin)
CFLAGS_WARN/os_bsd.o = $(CFLAGS_WARN/DEFAULT) -Wno-deprecated-declarations
endif
+# optimization control flags (Used by fastdebug and release variants)
+OPT_CFLAGS/NOOPT=-O0
+ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 8 \) \))" "1"
+ # Allow basic optimizations which don't distrupt debugging. (Principally dead code elimination)
+ OPT_CFLAGS/DEBUG=-Og
+else
+ # Allow no optimizations.
+ OPT_CFLAGS/DEBUG=-O0
+endif
OPT_CFLAGS/SIZE=-Os
OPT_CFLAGS/SPEED=-O3
-# Hotspot uses very unstrict aliasing turn this optimization off
-# This option is added to CFLAGS rather than OPT_CFLAGS
-# so that OPT_CFLAGS overrides get this option too.
-CFLAGS += -fno-strict-aliasing
-
-# The flags to use for an Optimized g++ build
ifeq ($(OS_VENDOR), Darwin)
# use -Os by default, unless -O3 can be proved to be worth the cost, as per policy
# <https://wiki.openjdk.java.net/display/MacOSXPort/Compiler+Errata>
@@ -295,6 +298,11 @@
OPT_CFLAGS_DEFAULT ?= SPEED
endif
+# Hotspot uses very unstrict aliasing turn this optimization off
+# This option is added to CFLAGS rather than OPT_CFLAGS
+# so that OPT_CFLAGS overrides get this option too.
+CFLAGS += -fno-strict-aliasing
+
ifdef OPT_CFLAGS
ifneq ("$(origin OPT_CFLAGS)", "command line")
$(error " Use OPT_EXTRAS instead of OPT_CFLAGS to add extra flags to OPT_CFLAGS.")
@@ -309,8 +317,6 @@
OPT_CFLAGS += -fno-expensive-optimizations
endif
-OPT_CFLAGS/NOOPT=-O0
-
# Work around some compiler bugs.
ifeq ($(USE_CLANG), true)
ifeq ($(shell expr $(CC_VER_MAJOR) = 4 \& $(CC_VER_MINOR) = 2), 1)
@@ -338,7 +344,7 @@
endif
ifeq ($(OS_VENDOR), Darwin)
- # Setting these parameters makes it an error to link to macosx APIs that are
+ # Setting these parameters makes it an error to link to macosx APIs that are
# newer than the given OS version and makes the linked binaries compatible even
# if built on a newer version of the OS.
# The expected format is X.Y.Z
@@ -371,10 +377,22 @@
ifeq ($(USE_CLANG),)
# statically link libgcc and/or libgcc_s, libgcc does not exist before gcc-3.x.
- ifneq ("${CC_VER_MAJOR}", "2")
+ ifneq ($(CC_VER_MAJOR), 2)
STATIC_LIBGCC += -static-libgcc
endif
+ ifneq ($(OS_VENDOR), Darwin)
+ ifneq (, findstring(debug,$(BUILD_FLAVOR)))
+ # for relocations read-only
+ LFLAGS += -Xlinker -z -Xlinker relro
+
+ ifeq ($(BUILD_FLAVOR), debug)
+ # disable incremental relocations linking
+ LFLAGS += -Xlinker -z -Xlinker now
+ endif
+ endif
+ endif
+
ifeq ($(BUILDARCH), ia64)
LFLAGS += -Wl,-relax
endif
@@ -425,6 +443,14 @@
CFLAGS += -flimit-debug-info
endif
+ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 8 \) \))" "1"
+ # Allow basic optimizations which don't distrupt debugging. (Principally dead code elimination)
+ DEBUG_CFLAGS=-Og
+else
+ # Allow no optimizations.
+ DEBUG_CFLAGS=-O0
+endif
+
# DEBUG_BINARIES uses full -g debug information for all configs
ifeq ($(DEBUG_BINARIES), true)
CFLAGS += -g
@@ -441,9 +467,14 @@
DEBUG_CFLAGS/ppc = -g
DEBUG_CFLAGS += $(DEBUG_CFLAGS/$(BUILDARCH))
ifeq ($(DEBUG_CFLAGS/$(BUILDARCH)),)
- DEBUG_CFLAGS += -gstabs
+ ifeq ($(USE_CLANG), true)
+ # Clang doesn't understand -gstabs
+ DEBUG_CFLAGS += -g
+ else
+ DEBUG_CFLAGS += -gstabs
+ endif
endif
-
+
ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1)
FASTDEBUG_CFLAGS/ia64 = -g
FASTDEBUG_CFLAGS/amd64 = -g
@@ -458,7 +489,7 @@
FASTDEBUG_CFLAGS += -gstabs
endif
endif
-
+
OPT_CFLAGS/ia64 = -g
OPT_CFLAGS/amd64 = -g
OPT_CFLAGS/arm = -g
@@ -475,6 +506,18 @@
endif
endif
+ifeq ($(USE_CLANG),)
+ # Enable bounds checking.
+ # _FORTIFY_SOURCE appears in GCC 4.0+
+ ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 3 \) )" "1"
+ # compile time size bounds checks
+ FASTDEBUG_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
+
+ # and runtime size bounds checks and paranoid stack smashing checks.
+ DEBUG_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fstack-protector-all --param ssp-buffer-size=1
+ endif
+endif
+
# If we are building HEADLESS, pass on to VM
# so it can set the java.awt.headless property
ifdef HEADLESS
--- a/hotspot/make/linux/makefiles/fastdebug.make Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/make/linux/makefiles/fastdebug.make Wed Jul 05 19:46:31 2017 +0200
@@ -24,6 +24,11 @@
# Sets make macros for making debug version of VM
+# Compiler specific DEBUG_CFLAGS are passed in from gcc.make, sparcWorks.make
+# They may also specify FASTDEBUG_CFLAGS, but it defaults to DEBUG_CFLAGS.
+
+FASTDEBUG_CFLAGS$(FASTDEBUG_CFLAGS) = $(DEBUG_CFLAGS)
+
# Compiler specific OPT_CFLAGS are passed in from gcc.make, sparcWorks.make
OPT_CFLAGS/DEFAULT= $(OPT_CFLAGS)
OPT_CFLAGS/BYFILE = $(OPT_CFLAGS/$@)$(OPT_CFLAGS/DEFAULT$(OPT_CFLAGS/$@))
@@ -54,6 +59,12 @@
# Set the environment variable HOTSPARC_GENERIC to "true"
# to inhibit the effect of the previous line on CFLAGS.
+# The following lines are copied from debug.make, except that we
+# consult FASTDEBUG_CFLAGS instead of DEBUG_CFLAGS.
+# Compiler specific DEBUG_CFLAGS are passed in from gcc.make, sparcWorks.make
+DEBUG_CFLAGS/DEFAULT= $(FASTDEBUG_CFLAGS)
+DEBUG_CFLAGS/BYFILE = $(DEBUG_CFLAGS/$@)$(DEBUG_CFLAGS/DEFAULT$(DEBUG_CFLAGS/$@))
+CFLAGS += $(DEBUG_CFLAGS/BYFILE)
# Linker mapfile
MAPFILE = $(GAMMADIR)/make/linux/makefiles/mapfile-vers-debug
--- a/hotspot/make/linux/makefiles/gcc.make Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/make/linux/makefiles/gcc.make Wed Jul 05 19:46:31 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.
-#
+#
#
#------------------------------------------------------------------------
@@ -62,7 +62,6 @@
CC_VER_MINOR := $(shell $(CC) -dumpversion | sed 's/egcs-//' | cut -d'.' -f2)
endif
-
ifeq ($(USE_CLANG), true)
# Clang has precompiled headers support by default, but the user can switch
# it off by using 'USE_PRECOMPILED_HEADER=0'.
@@ -104,7 +103,7 @@
# But Clang doesn't support a precompiled header which was compiled with -O3
# to be used in a compilation unit which uses '-O0'. We could also prepare an
# extra '-O0' PCH file for the opt build and use it here, but it's probably
- # not worth the effoert as long as only two files need this special handling.
+ # not worth the effort as long as only two files need this special handling.
PCH_FLAG/loopTransform.o = $(PCH_FLAG/NO_PCH)
PCH_FLAG/sharedRuntimeTrig.o = $(PCH_FLAG/NO_PCH)
PCH_FLAG/sharedRuntimeTrans.o = $(PCH_FLAG/NO_PCH)
@@ -226,19 +225,28 @@
endif
CFLAGS_WARN/DEFAULT = $(WARNINGS_ARE_ERRORS) $(WARNING_FLAGS)
+
# Special cases
-CFLAGS_WARN/BYFILE = $(CFLAGS_WARN/$@)$(CFLAGS_WARN/DEFAULT$(CFLAGS_WARN/$@))
+CFLAGS_WARN/BYFILE = $(CFLAGS_WARN/$@)$(CFLAGS_WARN/DEFAULT$(CFLAGS_WARN/$@))
-# The flags to use for an Optimized g++ build
+# optimization control flags (Used by fastdebug and release variants)
+OPT_CFLAGS/NOOPT=-O0
+ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 8 \) \))" "1"
+ # Allow basic optimizations which don't distrupt debugging. (Principally dead code elimination)
+ OPT_CFLAGS/DEBUG=-Og
+else
+ # Allow no optimizations.
+ OPT_CFLAGS/DEBUG=-O0
+endif
OPT_CFLAGS/SIZE=-Os
OPT_CFLAGS/SPEED=-O3
+OPT_CFLAGS_DEFAULT ?= SPEED
+
# Hotspot uses very unstrict aliasing turn this optimization off
# This option is added to CFLAGS rather than OPT_CFLAGS
# so that OPT_CFLAGS overrides get this option too.
-CFLAGS += -fno-strict-aliasing
-
-OPT_CFLAGS_DEFAULT ?= SPEED
+CFLAGS += -fno-strict-aliasing
ifdef OPT_CFLAGS
ifneq ("$(origin OPT_CFLAGS)", "command line")
@@ -248,14 +256,12 @@
OPT_CFLAGS = $(OPT_CFLAGS/$(OPT_CFLAGS_DEFAULT)) $(OPT_EXTRAS)
-# The gcc compiler segv's on ia64 when compiling bytecodeInterpreter.cpp
+# The gcc compiler segv's on ia64 when compiling bytecodeInterpreter.cpp
# if we use expensive-optimizations
ifeq ($(BUILDARCH), ia64)
OPT_CFLAGS += -fno-expensive-optimizations
endif
-OPT_CFLAGS/NOOPT=-O0
-
# Work around some compiler bugs.
ifeq ($(USE_CLANG), true)
ifeq ($(shell expr $(CC_VER_MAJOR) = 4 \& $(CC_VER_MINOR) = 2), 1)
@@ -271,7 +277,7 @@
# Flags for generating make dependency flags.
DEPFLAGS = -MMD -MP -MF $(DEP_DIR)/$(@:%=%.d)
ifeq ($(USE_CLANG),)
- ifneq ("${CC_VER_MAJOR}", "2")
+ ifneq ($(CC_VER_MAJOR), 2)
DEPFLAGS += -fpch-deps
endif
endif
@@ -282,21 +288,26 @@
# statically link libstdc++.so, work with gcc but ignored by g++
STATIC_STDCXX = -Wl,-Bstatic -lstdc++ -Wl,-Bdynamic
+# Enable linker optimization
+LFLAGS += -Xlinker -O1
+
ifeq ($(USE_CLANG),)
- # statically link libgcc and/or libgcc_s, libgcc does not exist before gcc-3.x.
- ifneq ("${CC_VER_MAJOR}", "2")
- STATIC_LIBGCC += -static-libgcc
+ STATIC_LIBGCC += -static-libgcc
+
+ ifneq (, findstring(debug,$(BUILD_FLAVOR)))
+ # for relocations read-only
+ LFLAGS += -Xlinker -z -Xlinker relro
+
+ ifeq ($(BUILD_FLAVOR), debug)
+ # disable incremental relocations linking
+ LFLAGS += -Xlinker -z -Xlinker now
+ endif
endif
ifeq ($(BUILDARCH), ia64)
LFLAGS += -Wl,-relax
endif
-endif
-# Enable linker optimization
-LFLAGS += -Xlinker -O1
-
-ifeq ($(USE_CLANG),)
# If this is a --hash-style=gnu system, use --hash-style=both
# The gnu .hash section won't work on some Linux systems like SuSE 10.
_HAS_HASH_STYLE_GNU:=$(shell $(CC) -dumpspecs | grep -- '--hash-style=gnu')
@@ -333,6 +344,14 @@
CFLAGS += -flimit-debug-info
endif
+ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 8 \) \))" "1"
+ # Allow basic optimizations which don't distrupt debugging. (Principally dead code elimination)
+ DEBUG_CFLAGS=-Og
+else
+ # Allow no optimizations.
+ DEBUG_CFLAGS=-O0
+endif
+
# DEBUG_BINARIES uses full -g debug information for all configs
ifeq ($(DEBUG_BINARIES), true)
CFLAGS += -g
@@ -355,6 +374,18 @@
endif
endif
+ifeq ($(USE_CLANG),)
+ # Enable bounds checking.
+ # _FORTIFY_SOURCE appears in GCC 4.0+
+ ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 3 \) )" "1"
+ # compile time size bounds checks
+ FASTDEBUG_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
+
+ # and runtime size bounds checks and paranoid stack smashing checks.
+ DEBUG_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fstack-protector-all --param ssp-buffer-size=1
+ endif
+endif
+
# If we are building HEADLESS, pass on to VM
# so it can set the java.awt.headless property
ifdef HEADLESS
--- a/hotspot/make/solaris/makefiles/gcc.make Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/make/solaris/makefiles/gcc.make Wed Jul 05 19:46:31 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.
-#
+#
#
#------------------------------------------------------------------------
@@ -40,7 +40,7 @@
CC_VER_MAJOR := $(shell $(CC) -dumpversion | sed 's/egcs-//' | cut -d'.' -f1)
CC_VER_MINOR := $(shell $(CC) -dumpversion | sed 's/egcs-//' | cut -d'.' -f2)
-# Check for the versions of C++ and C compilers ($CXX and $CC) used.
+# Check for the versions of C++ and C compilers ($CXX and $CC) used.
# Get the last thing on the line that looks like x.x+ (x is a digit).
COMPILER_REV := \
@@ -98,7 +98,7 @@
ifeq ($(BUILDARCH), amd64)
ASFLAGS += -march=k8 -march=amd64
-LFLAGS += -march=k8
+LFLAGS += -march=k8
endif
@@ -115,21 +115,44 @@
endif
-# Compiler warnings are treated as errors
-WARNINGS_ARE_ERRORS = -Werror
+# Compiler warnings are treated as errors
+WARNINGS_ARE_ERRORS = -Werror
+
# Enable these warnings. See 'info gcc' about details on these options
WARNING_FLAGS = -Wpointer-arith -Wconversion -Wsign-compare -Wundef -Wformat=2
CFLAGS_WARN/DEFAULT = $(WARNINGS_ARE_ERRORS) $(WARNING_FLAGS)
-# Special cases
-CFLAGS_WARN/BYFILE = $(CFLAGS_WARN/$@)$(CFLAGS_WARN/DEFAULT$(CFLAGS_WARN/$@))
+
+# Special cases
+CFLAGS_WARN/BYFILE = $(CFLAGS_WARN/$@)$(CFLAGS_WARN/DEFAULT$(CFLAGS_WARN/$@))
-# The flags to use for an Optimized g++ build
-OPT_CFLAGS += -O3
+# optimization control flags (Used by fastdebug and release variants)
+OPT_CFLAGS/NOOPT=-O0
+ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 8 \) \))" "1"
+ # Allow basic optimizations which don't distrupt debugging. (Principally dead code elimination)
+ OPT_CFLAGS/DEBUG=-Og
++else
+ # Allow no optimizations.
+ OPT_CFLAGS/DEBUG=-O0
+endif
+OPT_CFLAGS/SIZE=-Os
+OPT_CFLAGS/SPEED=-O3
+
+OPT_CFLAGS_DEFAULT ?= SPEED
# Hotspot uses very unstrict aliasing turn this optimization off
-OPT_CFLAGS += -fno-strict-aliasing
+# This option is added to CFLAGS rather than OPT_CFLAGS
+# so that OPT_CFLAGS overrides get this option too.
+CFLAGS += -fno-strict-aliasing
-# The gcc compiler segv's on ia64 when compiling bytecodeInterpreter.cpp
+ifdef OPT_CFLAGS
+ ifneq ("$(origin OPT_CFLAGS)", "command line")
+ $(error " Use OPT_EXTRAS instead of OPT_CFLAGS to add extra flags to OPT_CFLAGS.")
+ endif
+endif
+
+OPT_CFLAGS = $(OPT_CFLAGS/$(OPT_CFLAGS_DEFAULT)) $(OPT_EXTRAS)
+
+# The gcc compiler segv's on ia64 when compiling bytecodeInterpreter.cpp
# if we use expensive-optimizations
# Note: all ia64 setting reflect the ones for linux
# No actial testing was performed: there is no Solaris on ia64 presently
@@ -137,10 +160,20 @@
OPT_CFLAGS/bytecodeInterpreter.o += -fno-expensive-optimizations
endif
-OPT_CFLAGS/NOOPT=-O0
+# Work around some compiler bugs.
+ifeq ($(USE_CLANG), true)
+ ifeq ($(shell expr $(CC_VER_MAJOR) = 4 \& $(CC_VER_MINOR) = 2), 1)
+ OPT_CFLAGS/loopTransform.o += $(OPT_CFLAGS/NOOPT)
+ endif
+else
+ # 6835796. Problem in GCC 4.3.0 with mulnode.o optimized compilation.
+ ifeq ($(shell expr $(CC_VER_MAJOR) = 4 \& $(CC_VER_MINOR) = 3), 1)
+ OPT_CFLAGS/mulnode.o += $(OPT_CFLAGS/NOOPT)
+ endif
+endif
# Flags for generating make dependency flags.
-ifneq ("${CC_VER_MAJOR}", "2")
+ifneq ($(CC_VER_MAJOR), 2)
DEPFLAGS = -fpch-deps -MMD -MP -MF $(DEP_DIR)/$(@:%=%.d)
endif
@@ -155,26 +188,37 @@
# statically link libstdc++.so, work with gcc but ignored by g++
STATIC_STDCXX = -Wl,-Bstatic -lstdc++ -Wl,-Bdynamic
-# statically link libgcc and/or libgcc_s, libgcc does not exist before gcc-3.x.
-ifneq ("${CC_VER_MAJOR}", "2")
-STATIC_LIBGCC += -static-libgcc
-endif
-
-ifeq ($(BUILDARCH), ia64)
-# Note: all ia64 setting reflect the ones for linux
-# No actial testing was performed: there is no Solaris on ia64 presently
-LFLAGS += -Wl,-relax
-endif
ifdef USE_GNULD
-# Enable linker optimization
-LFLAGS += -Xlinker -O1
+ # statically link libgcc and/or libgcc_s, libgcc does not exist before gcc-3.x.
+ ifneq ($(CC_VER_MAJOR), 2)
+ STATIC_LIBGCC += -static-libgcc
+ endif
+
+ # Enable linker optimization
+ LFLAGS += -Xlinker -O1
+
+ ifneq (, findstring(debug,$(BUILD_FLAVOR)))
+ # for relocations read-only
+ LFLAGS += -Xlinker -z -Xlinker relro
-# Use $(MAPFLAG:FILENAME=real_file_name) to specify a map file.
-MAPFLAG = -Xlinker --version-script=FILENAME
-else
-MAPFLAG = -Xlinker -M -Xlinker FILENAME
-endif
+ ifeq ($(BUILD_FLAVOR), debug)
+ # disable incremental relocations linking
+ LFLAGS += -Xlinker -z -Xlinker now
+ endif
+ endif
+
+ ifeq ($(BUILDARCH), ia64)
+ # Note: all ia64 setting reflect the ones for linux
+ # No actual testing was performed: there is no Solaris on ia64 presently
+ LFLAGS += -Wl,-relax
+ endif
+
+ # Use $(MAPFLAG:FILENAME=real_file_name) to specify a map file.
+ MAPFLAG = -Xlinker --version-script=FILENAME
+else
+ MAPFLAG = -Xlinker -M -Xlinker FILENAME
+endif
# Use $(SONAMEFLAG:SONAME=soname) to specify the intrinsic name of a shared obj
SONAMEFLAG = -Xlinker -soname=SONAME
@@ -185,15 +229,34 @@
#------------------------------------------------------------------------
# Debug flags
-# Use the stabs format for debugging information (this is the default
-# on gcc-2.91). It's good enough, has all the information about line
-# numbers and local variables, and libjvm.so is only about 16M.
-# Change this back to "-g" if you want the most expressive format.
-# (warning: that could easily inflate libjvm.so to 150M!)
-# Note: The Itanium gcc compiler crashes when using -gstabs.
-DEBUG_CFLAGS/ia64 = -g
-DEBUG_CFLAGS/amd64 = -g
-DEBUG_CFLAGS += $(DEBUG_CFLAGS/$(BUILDARCH))
-ifeq ($(DEBUG_CFLAGS/$(BUILDARCH)),)
-DEBUG_CFLAGS += -gstabs
-endif
+ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 8 \) \))" "1"
+ # Allow basic optimizations which don't distrupt debugging. (Principally dead code elimination)
+ DEBUG_CFLAGS=-Og
+else
+ # Allow no optimizations.
+ DEBUG_CFLAGS=-O0
+endif
+
+
+# Use the stabs format for debugging information (this is the default
+# on gcc-2.91). It's good enough, has all the information about line
+# numbers and local variables, and libjvm.so is only about 16M.
+# Change this back to "-g" if you want the most expressive format.
+# (warning: that could easily inflate libjvm.so to 150M!)
+# Note: The Itanium gcc compiler crashes when using -gstabs.
+DEBUG_CFLAGS/ia64 = -g
+DEBUG_CFLAGS/amd64 = -g
+DEBUG_CFLAGS += $(DEBUG_CFLAGS/$(BUILDARCH))
+ifeq ($(DEBUG_CFLAGS/$(BUILDARCH)),)
+ DEBUG_CFLAGS += -gstabs
+endif
+
+# Enable bounds checking.
+# _FORTIFY_SOURCE appears in GCC 4.0+
+ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 3 \) )" "1"
+ # compile time size bounds checks
+ FASTDEBUG_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
+
+ # and runtime size bounds checks and paranoid stack smashing checks.
+ DEBUG_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fstack-protector-all --param ssp-buffer-size=1
+endif
--- a/hotspot/src/cpu/ppc/vm/ppc.ad Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/cpu/ppc/vm/ppc.ad Wed Jul 05 19:46:31 2017 +0200
@@ -1285,9 +1285,9 @@
void MachConstantBaseNode::postalloc_expand(GrowableArray <Node *> *nodes, PhaseRegAlloc *ra_) {
Compile *C = ra_->C;
- iRegPdstOper *op_dst = new (C) iRegPdstOper();
- MachNode *m1 = new (C) loadToc_hiNode();
- MachNode *m2 = new (C) loadToc_loNode();
+ iRegPdstOper *op_dst = new iRegPdstOper();
+ MachNode *m1 = new loadToc_hiNode();
+ MachNode *m2 = new loadToc_loNode();
m1->add_req(NULL);
m2->add_req(NULL, m1);
@@ -2232,9 +2232,9 @@
MachTypeNode *Matcher::make_decode_node(Compile *C) {
assert(Universe::narrow_oop_base() == NULL && Universe::narrow_oop_shift() == 0,
"This method is only implemented for unscaled cOops mode so far");
- MachTypeNode *decode = new (C) decodeN_unscaledNode();
- decode->set_opnd_array(0, new (C) iRegPdstOper());
- decode->set_opnd_array(1, new (C) iRegNsrcOper());
+ MachTypeNode *decode = new decodeN_unscaledNode();
+ decode->set_opnd_array(0, new iRegPdstOper());
+ decode->set_opnd_array(1, new iRegNsrcOper());
return decode;
}
*/
@@ -2600,20 +2600,20 @@
const bool large_constant_pool = true; // TODO: PPC port C->cfg()->_consts_size > 4000;
if (large_constant_pool) {
// Create new nodes.
- loadConL_hiNode *m1 = new (C) loadConL_hiNode();
- loadConL_loNode *m2 = new (C) loadConL_loNode();
+ loadConL_hiNode *m1 = new loadConL_hiNode();
+ loadConL_loNode *m2 = new loadConL_loNode();
// inputs for new nodes
m1->add_req(NULL, toc);
m2->add_req(NULL, m1);
// operands for new nodes
- m1->_opnds[0] = new (C) iRegLdstOper(); // dst
- m1->_opnds[1] = immSrc; // src
- m1->_opnds[2] = new (C) iRegPdstOper(); // toc
- m2->_opnds[0] = new (C) iRegLdstOper(); // dst
- m2->_opnds[1] = immSrc; // src
- m2->_opnds[2] = new (C) iRegLdstOper(); // base
+ m1->_opnds[0] = new iRegLdstOper(); // dst
+ m1->_opnds[1] = immSrc; // src
+ m1->_opnds[2] = new iRegPdstOper(); // toc
+ m2->_opnds[0] = new iRegLdstOper(); // dst
+ m2->_opnds[1] = immSrc; // src
+ m2->_opnds[2] = new iRegLdstOper(); // base
// Initialize ins_attrib TOC fields.
m1->_const_toc_offset = -1;
@@ -2633,15 +2633,15 @@
nodes._last = nodes._large_lo;
assert(m2->bottom_type()->isa_long(), "must be long");
} else {
- loadConLNode *m2 = new (C) loadConLNode();
+ loadConLNode *m2 = new loadConLNode();
// inputs for new nodes
m2->add_req(NULL, toc);
// operands for new nodes
- m2->_opnds[0] = new (C) iRegLdstOper(); // dst
- m2->_opnds[1] = immSrc; // src
- m2->_opnds[2] = new (C) iRegPdstOper(); // toc
+ m2->_opnds[0] = new iRegLdstOper(); // dst
+ m2->_opnds[1] = immSrc; // src
+ m2->_opnds[2] = new iRegPdstOper(); // toc
// Initialize ins_attrib instruction offset.
m2->_cbuf_insts_offset = -1;
@@ -2750,20 +2750,20 @@
const bool large_constant_pool = true; // TODO: PPC port C->cfg()->_consts_size > 4000;
if (large_constant_pool) {
// Create new nodes.
- loadConP_hiNode *m1 = new (C) loadConP_hiNode();
- loadConP_loNode *m2 = new (C) loadConP_loNode();
+ loadConP_hiNode *m1 = new loadConP_hiNode();
+ loadConP_loNode *m2 = new loadConP_loNode();
// inputs for new nodes
m1->add_req(NULL, n_toc);
m2->add_req(NULL, m1);
// operands for new nodes
- m1->_opnds[0] = new (C) iRegPdstOper(); // dst
- m1->_opnds[1] = op_src; // src
- m1->_opnds[2] = new (C) iRegPdstOper(); // toc
- m2->_opnds[0] = new (C) iRegPdstOper(); // dst
- m2->_opnds[1] = op_src; // src
- m2->_opnds[2] = new (C) iRegLdstOper(); // base
+ m1->_opnds[0] = new iRegPdstOper(); // dst
+ m1->_opnds[1] = op_src; // src
+ m1->_opnds[2] = new iRegPdstOper(); // toc
+ m2->_opnds[0] = new iRegPdstOper(); // dst
+ m2->_opnds[1] = op_src; // src
+ m2->_opnds[2] = new iRegLdstOper(); // base
// Initialize ins_attrib TOC fields.
m1->_const_toc_offset = -1;
@@ -2777,15 +2777,15 @@
nodes->push(m2);
assert(m2->bottom_type()->isa_ptr(), "must be ptr");
} else {
- loadConPNode *m2 = new (C) loadConPNode();
+ loadConPNode *m2 = new loadConPNode();
// inputs for new nodes
m2->add_req(NULL, n_toc);
// operands for new nodes
- m2->_opnds[0] = new (C) iRegPdstOper(); // dst
- m2->_opnds[1] = op_src; // src
- m2->_opnds[2] = new (C) iRegPdstOper(); // toc
+ m2->_opnds[0] = new iRegPdstOper(); // dst
+ m2->_opnds[1] = op_src; // src
+ m2->_opnds[2] = new iRegPdstOper(); // toc
// Register allocation for new nodes.
ra_->set_pair(m2->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this));
@@ -2802,9 +2802,9 @@
MachNode *m2;
if (large_constant_pool) {
- m2 = new (C) loadConFCompNode();
+ m2 = new loadConFCompNode();
} else {
- m2 = new (C) loadConFNode();
+ m2 = new loadConFNode();
}
// inputs for new nodes
m2->add_req(NULL, n_toc);
@@ -2812,7 +2812,7 @@
// operands for new nodes
m2->_opnds[0] = op_dst;
m2->_opnds[1] = op_src;
- m2->_opnds[2] = new (C) iRegPdstOper(); // constanttablebase
+ m2->_opnds[2] = new iRegPdstOper(); // constanttablebase
// register allocation for new nodes
ra_->set_pair(m2->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this));
@@ -2826,9 +2826,9 @@
MachNode *m2;
if (large_constant_pool) {
- m2 = new (C) loadConDCompNode();
+ m2 = new loadConDCompNode();
} else {
- m2 = new (C) loadConDNode();
+ m2 = new loadConDNode();
}
// inputs for new nodes
m2->add_req(NULL, n_toc);
@@ -2836,7 +2836,7 @@
// operands for new nodes
m2->_opnds[0] = op_dst;
m2->_opnds[1] = op_src;
- m2->_opnds[2] = new (C) iRegPdstOper(); // constanttablebase
+ m2->_opnds[2] = new iRegPdstOper(); // constanttablebase
// register allocation for new nodes
ra_->set_pair(m2->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this));
@@ -2918,15 +2918,15 @@
if (VM_Version::has_isel()) {
// use isel instruction with Power 7
- cmpP_reg_imm16Node *n_compare = new (C) cmpP_reg_imm16Node();
- encodeP_subNode *n_sub_base = new (C) encodeP_subNode();
- encodeP_shiftNode *n_shift = new (C) encodeP_shiftNode();
- cond_set_0_oopNode *n_cond_set = new (C) cond_set_0_oopNode();
+ cmpP_reg_imm16Node *n_compare = new cmpP_reg_imm16Node();
+ encodeP_subNode *n_sub_base = new encodeP_subNode();
+ encodeP_shiftNode *n_shift = new encodeP_shiftNode();
+ cond_set_0_oopNode *n_cond_set = new cond_set_0_oopNode();
n_compare->add_req(n_region, n_src);
n_compare->_opnds[0] = op_crx;
n_compare->_opnds[1] = op_src;
- n_compare->_opnds[2] = new (C) immL16Oper(0);
+ n_compare->_opnds[2] = new immL16Oper(0);
n_sub_base->add_req(n_region, n_src);
n_sub_base->_opnds[0] = op_dst;
@@ -2956,10 +2956,10 @@
} else {
// before Power 7
- moveRegNode *n_move = new (C) moveRegNode();
- cmpP_reg_imm16Node *n_compare = new (C) cmpP_reg_imm16Node();
- encodeP_shiftNode *n_shift = new (C) encodeP_shiftNode();
- cond_sub_baseNode *n_sub_base = new (C) cond_sub_baseNode();
+ moveRegNode *n_move = new moveRegNode();
+ cmpP_reg_imm16Node *n_compare = new cmpP_reg_imm16Node();
+ encodeP_shiftNode *n_shift = new encodeP_shiftNode();
+ cond_sub_baseNode *n_sub_base = new cond_sub_baseNode();
n_move->add_req(n_region, n_src);
n_move->_opnds[0] = op_dst;
@@ -2971,7 +2971,7 @@
n_compare->_opnds[0] = op_crx;
n_compare->_opnds[1] = op_src;
- n_compare->_opnds[2] = new (C) immL16Oper(0);
+ n_compare->_opnds[2] = new immL16Oper(0);
n_sub_base->add_req(n_region, n_compare, n_src);
n_sub_base->_opnds[0] = op_dst;
@@ -3000,13 +3000,13 @@
enc_class postalloc_expand_encode_oop_not_null(iRegNdst dst, iRegPdst src) %{
- encodeP_subNode *n1 = new (C) encodeP_subNode();
+ encodeP_subNode *n1 = new encodeP_subNode();
n1->add_req(n_region, n_src);
n1->_opnds[0] = op_dst;
n1->_opnds[1] = op_src;
n1->_bottom_type = _bottom_type;
- encodeP_shiftNode *n2 = new (C) encodeP_shiftNode();
+ encodeP_shiftNode *n2 = new encodeP_shiftNode();
n2->add_req(n_region, n1);
n2->_opnds[0] = op_dst;
n2->_opnds[1] = op_dst;
@@ -3020,13 +3020,13 @@
%}
enc_class postalloc_expand_decode_oop(iRegPdst dst, iRegNsrc src, flagsReg crx) %{
- decodeN_shiftNode *n_shift = new (C) decodeN_shiftNode();
- cmpN_reg_imm0Node *n_compare = new (C) cmpN_reg_imm0Node();
+ decodeN_shiftNode *n_shift = new decodeN_shiftNode();
+ cmpN_reg_imm0Node *n_compare = new cmpN_reg_imm0Node();
n_compare->add_req(n_region, n_src);
n_compare->_opnds[0] = op_crx;
n_compare->_opnds[1] = op_src;
- n_compare->_opnds[2] = new (C) immN_0Oper(TypeNarrowOop::NULL_PTR);
+ n_compare->_opnds[2] = new immN_0Oper(TypeNarrowOop::NULL_PTR);
n_shift->add_req(n_region, n_src);
n_shift->_opnds[0] = op_dst;
@@ -3036,13 +3036,13 @@
if (VM_Version::has_isel()) {
// use isel instruction with Power 7
- decodeN_addNode *n_add_base = new (C) decodeN_addNode();
+ decodeN_addNode *n_add_base = new decodeN_addNode();
n_add_base->add_req(n_region, n_shift);
n_add_base->_opnds[0] = op_dst;
n_add_base->_opnds[1] = op_dst;
n_add_base->_bottom_type = _bottom_type;
- cond_set_0_ptrNode *n_cond_set = new (C) cond_set_0_ptrNode();
+ cond_set_0_ptrNode *n_cond_set = new cond_set_0_ptrNode();
n_cond_set->add_req(n_region, n_compare, n_add_base);
n_cond_set->_opnds[0] = op_dst;
n_cond_set->_opnds[1] = op_crx;
@@ -3064,7 +3064,7 @@
} else {
// before Power 7
- cond_add_baseNode *n_add_base = new (C) cond_add_baseNode();
+ cond_add_baseNode *n_add_base = new cond_add_baseNode();
n_add_base->add_req(n_region, n_compare, n_shift);
n_add_base->_opnds[0] = op_dst;
@@ -3086,13 +3086,13 @@
%}
enc_class postalloc_expand_decode_oop_not_null(iRegPdst dst, iRegNsrc src) %{
- decodeN_shiftNode *n1 = new (C) decodeN_shiftNode();
+ decodeN_shiftNode *n1 = new decodeN_shiftNode();
n1->add_req(n_region, n_src);
n1->_opnds[0] = op_dst;
n1->_opnds[1] = op_src;
n1->_bottom_type = _bottom_type;
- decodeN_addNode *n2 = new (C) decodeN_addNode();
+ decodeN_addNode *n2 = new decodeN_addNode();
n2->add_req(n_region, n1);
n2->_opnds[0] = op_dst;
n2->_opnds[1] = op_dst;
@@ -3388,7 +3388,7 @@
// Create new nodes.
// Make an operand with the bit pattern to load as float.
- immLOper *op_repl = new (C) immLOper((jlong)replicate_immF(op_src->constantF()));
+ immLOper *op_repl = new immLOper((jlong)replicate_immF(op_src->constantF()));
loadConLNodesTuple loadConLNodes =
loadConLNodesTuple_create(C, ra_, n_toc, op_repl,
@@ -3611,11 +3611,11 @@
// Create the nodes for loading the IC from the TOC.
loadConLNodesTuple loadConLNodes_IC =
- loadConLNodesTuple_create(C, ra_, n_toc, new (C) immLOper((jlong)Universe::non_oop_word()),
+ loadConLNodesTuple_create(C, ra_, n_toc, new immLOper((jlong)Universe::non_oop_word()),
OptoReg::Name(R19_H_num), OptoReg::Name(R19_num));
// Create the call node.
- CallDynamicJavaDirectSchedNode *call = new (C) CallDynamicJavaDirectSchedNode();
+ CallDynamicJavaDirectSchedNode *call = new CallDynamicJavaDirectSchedNode();
call->_method_handle_invoke = _method_handle_invoke;
call->_vtable_index = _vtable_index;
call->_method = _method;
@@ -3765,7 +3765,7 @@
#if defined(ABI_ELFv2)
jlong entry_address = (jlong) this->entry_point();
assert(entry_address, "need address here");
- loadConLNodes_Entry = loadConLNodesTuple_create(C, ra_, n_toc, new (C) immLOper(entry_address),
+ loadConLNodes_Entry = loadConLNodesTuple_create(C, ra_, n_toc, new immLOper(entry_address),
OptoReg::Name(R12_H_num), OptoReg::Name(R12_num));
#else
// Get the struct that describes the function we are about to call.
@@ -3777,42 +3777,42 @@
loadConLNodesTuple loadConLNodes_Toc;
// Create nodes and operands for loading the entry point.
- loadConLNodes_Entry = loadConLNodesTuple_create(C, ra_, n_toc, new (C) immLOper(entry_address),
+ loadConLNodes_Entry = loadConLNodesTuple_create(C, ra_, n_toc, new immLOper(entry_address),
OptoReg::Name(R12_H_num), OptoReg::Name(R12_num));
// Create nodes and operands for loading the env pointer.
if (fd->env() != NULL) {
- loadConLNodes_Env = loadConLNodesTuple_create(C, ra_, n_toc, new (C) immLOper((jlong) fd->env()),
+ loadConLNodes_Env = loadConLNodesTuple_create(C, ra_, n_toc, new immLOper((jlong) fd->env()),
OptoReg::Name(R11_H_num), OptoReg::Name(R11_num));
} else {
loadConLNodes_Env._large_hi = NULL;
loadConLNodes_Env._large_lo = NULL;
loadConLNodes_Env._small = NULL;
- loadConLNodes_Env._last = new (C) loadConL16Node();
- loadConLNodes_Env._last->_opnds[0] = new (C) iRegLdstOper();
- loadConLNodes_Env._last->_opnds[1] = new (C) immL16Oper(0);
+ loadConLNodes_Env._last = new loadConL16Node();
+ loadConLNodes_Env._last->_opnds[0] = new iRegLdstOper();
+ loadConLNodes_Env._last->_opnds[1] = new immL16Oper(0);
ra_->set_pair(loadConLNodes_Env._last->_idx, OptoReg::Name(R11_H_num), OptoReg::Name(R11_num));
}
// Create nodes and operands for loading the Toc point.
- loadConLNodes_Toc = loadConLNodesTuple_create(C, ra_, n_toc, new (C) immLOper((jlong) fd->toc()),
+ loadConLNodes_Toc = loadConLNodesTuple_create(C, ra_, n_toc, new immLOper((jlong) fd->toc()),
OptoReg::Name(R2_H_num), OptoReg::Name(R2_num));
#endif // ABI_ELFv2
// mtctr node
- MachNode *mtctr = new (C) CallLeafDirect_mtctrNode();
+ MachNode *mtctr = new CallLeafDirect_mtctrNode();
assert(loadConLNodes_Entry._last != NULL, "entry must exist");
mtctr->add_req(0, loadConLNodes_Entry._last);
- mtctr->_opnds[0] = new (C) iRegLdstOper();
- mtctr->_opnds[1] = new (C) iRegLdstOper();
+ mtctr->_opnds[0] = new iRegLdstOper();
+ mtctr->_opnds[1] = new iRegLdstOper();
// call node
- MachCallLeafNode *call = new (C) CallLeafDirectNode();
+ MachCallLeafNode *call = new CallLeafDirectNode();
call->_opnds[0] = _opnds[0];
- call->_opnds[1] = new (C) methodOper((intptr_t) entry_address); // May get set later.
+ call->_opnds[1] = new methodOper((intptr_t) entry_address); // May get set later.
// Make the new call node look like the old one.
call->_name = _name;
@@ -6050,9 +6050,9 @@
format %{ "LoadN $dst, $src \t// postalloc expanded" %} // mask
postalloc_expand %{
- MachNode *m1 = new (C) loadConN_hiNode();
- MachNode *m2 = new (C) loadConN_loNode();
- MachNode *m3 = new (C) clearMs32bNode();
+ MachNode *m1 = new loadConN_hiNode();
+ MachNode *m2 = new loadConN_loNode();
+ MachNode *m3 = new clearMs32bNode();
m1->add_req(NULL);
m2->add_req(NULL, m1);
m3->add_req(NULL, m2);
@@ -6117,7 +6117,7 @@
format %{ "LoadN $dst, $src \t// postalloc expanded" %} // mask
postalloc_expand %{
// Load high bits into register. Sign extended.
- MachNode *m1 = new (C) loadConNKlass_hiNode();
+ MachNode *m1 = new loadConNKlass_hiNode();
m1->add_req(NULL);
m1->_opnds[0] = op_dst;
m1->_opnds[1] = op_src;
@@ -6127,7 +6127,7 @@
MachNode *m2 = m1;
if (!Assembler::is_uimm((jlong)Klass::encode_klass((Klass *)op_src->constant()), 31)) {
// Value might be 1-extended. Mask out these bits.
- m2 = new (C) clearMs32bNode();
+ m2 = new clearMs32bNode();
m2->add_req(NULL, m1);
m2->_opnds[0] = op_dst;
m2->_opnds[1] = op_dst;
@@ -6135,7 +6135,7 @@
nodes->push(m2);
}
- MachNode *m3 = new (C) loadConNKlass_loNode();
+ MachNode *m3 = new loadConNKlass_loNode();
m3->add_req(NULL, m2);
m3->_opnds[0] = op_dst;
m3->_opnds[1] = op_src;
@@ -6987,14 +6987,14 @@
format %{ "EncodePKlass $dst, $src\t// $src != Null, postalloc expanded" %}
postalloc_expand %{
- encodePKlass_sub_baseNode *n1 = new (C) encodePKlass_sub_baseNode();
+ encodePKlass_sub_baseNode *n1 = new encodePKlass_sub_baseNode();
n1->add_req(n_region, n_base, n_src);
n1->_opnds[0] = op_dst;
n1->_opnds[1] = op_base;
n1->_opnds[2] = op_src;
n1->_bottom_type = _bottom_type;
- encodePKlass_shiftNode *n2 = new (C) encodePKlass_shiftNode();
+ encodePKlass_shiftNode *n2 = new encodePKlass_shiftNode();
n2->add_req(n_region, n1);
n2->_opnds[0] = op_dst;
n2->_opnds[1] = op_dst;
@@ -7064,14 +7064,14 @@
format %{ "DecodeNKlass $dst = $base + ($src << 3) \t// $src != NULL, postalloc expanded" %}
postalloc_expand %{
- decodeNKlass_add_baseNode *n1 = new (C) decodeNKlass_add_baseNode();
+ decodeNKlass_add_baseNode *n1 = new decodeNKlass_add_baseNode();
n1->add_req(n_region, n_base, n_src);
n1->_opnds[0] = op_dst;
n1->_opnds[1] = op_base;
n1->_opnds[2] = op_src;
n1->_bottom_type = _bottom_type;
- decodeNKlass_shiftNode *n2 = new (C) decodeNKlass_shiftNode();
+ decodeNKlass_shiftNode *n2 = new decodeNKlass_shiftNode();
n2->add_req(n_region, n1);
n2->_opnds[0] = op_dst;
n2->_opnds[1] = op_dst;
@@ -9773,8 +9773,8 @@
//
// Create new nodes.
- MachNode *m1 = new (C) loadConI16Node();
- MachNode *m2 = new (C) cmovI_bso_stackSlotLNode();
+ MachNode *m1 = new loadConI16Node();
+ MachNode *m2 = new cmovI_bso_stackSlotLNode();
// inputs for new nodes
m1->add_req(n_region);
@@ -9785,7 +9785,7 @@
// operands for new nodes
m1->_opnds[0] = op_dst;
- m1->_opnds[1] = new (C) immI16Oper(0);
+ m1->_opnds[1] = new immI16Oper(0);
m2->_opnds[0] = op_dst;
m2->_opnds[1] = op_crx;
@@ -9942,8 +9942,8 @@
//
// Create new nodes.
- MachNode *m1 = new (C) loadConL16Node();
- MachNode *m2 = new (C) cmovL_bso_stackSlotLNode();
+ MachNode *m1 = new loadConL16Node();
+ MachNode *m2 = new cmovL_bso_stackSlotLNode();
// inputs for new nodes
m1->add_req(n_region);
@@ -9952,7 +9952,7 @@
// operands for new nodes
m1->_opnds[0] = op_dst;
- m1->_opnds[1] = new (C) immL16Oper(0);
+ m1->_opnds[1] = new immL16Oper(0);
m2->_opnds[0] = op_dst;
m2->_opnds[1] = op_crx;
m2->_opnds[2] = op_mem;
@@ -10288,8 +10288,8 @@
//
// Create new nodes.
- MachNode *m1 = new (C) loadConI16Node();
- MachNode *m2 = new (C) cmovI_conIvalueMinus1_conIvalue1Node();
+ MachNode *m1 = new loadConI16Node();
+ MachNode *m2 = new cmovI_conIvalueMinus1_conIvalue1Node();
// inputs for new nodes
m1->add_req(n_region);
@@ -10298,7 +10298,7 @@
// operands for new nodes
m1->_opnds[0] = op_dst;
- m1->_opnds[1] = new (C) immI16Oper(0);
+ m1->_opnds[1] = new immI16Oper(0);
m2->_opnds[0] = op_dst;
m2->_opnds[1] = op_crx;
@@ -10623,8 +10623,8 @@
//
// Create new nodes.
- MachNode *m1 = new (C) cmpFUnordered_reg_regNode();
- MachNode *m2 = new (C) cmov_bns_lessNode();
+ MachNode *m1 = new cmpFUnordered_reg_regNode();
+ MachNode *m2 = new cmov_bns_lessNode();
// inputs for new nodes
m1->add_req(n_region, n_src1, n_src2);
@@ -10698,8 +10698,8 @@
//
// create new nodes
- MachNode *m1 = new (C) cmpDUnordered_reg_regNode();
- MachNode *m2 = new (C) cmov_bns_lessNode();
+ MachNode *m1 = new cmpDUnordered_reg_regNode();
+ MachNode *m2 = new cmov_bns_lessNode();
// inputs for new nodes
m1->add_req(n_region, n_src1, n_src2);
--- a/hotspot/src/cpu/sparc/vm/assembler_sparc.hpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/cpu/sparc/vm/assembler_sparc.hpp Wed Jul 05 19:46:31 2017 +0200
@@ -123,6 +123,7 @@
fpop2_op3 = 0x35,
impdep1_op3 = 0x36,
aes3_op3 = 0x36,
+ sha_op3 = 0x36,
alignaddr_op3 = 0x36,
faligndata_op3 = 0x36,
flog3_op3 = 0x36,
@@ -223,7 +224,11 @@
mwtos_opf = 0x119,
aes_kexpand0_opf = 0x130,
- aes_kexpand2_opf = 0x131
+ aes_kexpand2_opf = 0x131,
+
+ sha1_opf = 0x141,
+ sha256_opf = 0x142,
+ sha512_opf = 0x143
};
enum op5s {
@@ -595,6 +600,11 @@
// AES crypto instructions supported only on certain processors
static void aes_only() { assert( VM_Version::has_aes(), "This instruction only works on SPARC with AES instructions support"); }
+ // SHA crypto instructions supported only on certain processors
+ static void sha1_only() { assert( VM_Version::has_sha1(), "This instruction only works on SPARC with SHA1"); }
+ static void sha256_only() { assert( VM_Version::has_sha256(), "This instruction only works on SPARC with SHA256"); }
+ static void sha512_only() { assert( VM_Version::has_sha512(), "This instruction only works on SPARC with SHA512"); }
+
// instruction only in VIS1
static void vis1_only() { assert( VM_Version::has_vis1(), "This instruction only works on SPARC with VIS1"); }
@@ -1179,7 +1189,6 @@
u_field(3, 29, 25) | immed(true) | simm(simm13a, 13)); }
inline void wrfprs( Register d) { v9_only(); emit_int32( op(arith_op) | rs1(d) | op3(wrreg_op3) | u_field(6, 29, 25)); }
-
// VIS1 instructions
void alignaddr( Register s1, Register s2, Register d ) { vis1_only(); emit_int32( op(arith_op) | rd(d) | op3(alignaddr_op3) | rs1(s1) | opf(alignaddr_opf) | rs2(s2)); }
@@ -1203,6 +1212,12 @@
void movwtos( Register s, FloatRegister d ) { vis3_only(); emit_int32( op(arith_op) | fd(d, FloatRegisterImpl::S) | op3(mftoi_op3) | opf(mwtos_opf) | rs2(s)); }
void movxtod( Register s, FloatRegister d ) { vis3_only(); emit_int32( op(arith_op) | fd(d, FloatRegisterImpl::D) | op3(mftoi_op3) | opf(mxtod_opf) | rs2(s)); }
+ // Crypto SHA instructions
+
+ void sha1() { sha1_only(); emit_int32( op(arith_op) | op3(sha_op3) | opf(sha1_opf)); }
+ void sha256() { sha256_only(); emit_int32( op(arith_op) | op3(sha_op3) | opf(sha256_opf)); }
+ void sha512() { sha512_only(); emit_int32( op(arith_op) | op3(sha_op3) | opf(sha512_opf)); }
+
// Creation
Assembler(CodeBuffer* code) : AbstractAssembler(code) {
#ifdef CHECK_DELAY
--- a/hotspot/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -1612,13 +1612,10 @@
__ set((intptr_t)os::get_polling_page(), tmp->as_register());
if (info != NULL) {
add_debug_info_for_branch(info);
- } else {
- __ relocate(relocInfo::poll_type);
}
-
int offset = __ offset();
+ __ relocate(relocInfo::poll_type);
__ ld_ptr(tmp->as_register(), 0, G0);
-
return offset;
}
--- a/hotspot/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -872,21 +872,19 @@
void LIRGenerator::do_NewInstance(NewInstance* x) {
+ print_if_not_loaded(x);
+
// This instruction can be deoptimized in the slow path : use
// O0 as result register.
const LIR_Opr reg = result_register_for(x->type());
-#ifndef PRODUCT
- if (PrintNotLoaded && !x->klass()->is_loaded()) {
- tty->print_cr(" ###class not loaded at new bci %d", x->printable_bci());
- }
-#endif
+
CodeEmitInfo* info = state_for(x, x->state());
LIR_Opr tmp1 = FrameMap::G1_oop_opr;
LIR_Opr tmp2 = FrameMap::G3_oop_opr;
LIR_Opr tmp3 = FrameMap::G4_oop_opr;
LIR_Opr tmp4 = FrameMap::O1_oop_opr;
LIR_Opr klass_reg = FrameMap::G5_metadata_opr;
- new_instance(reg, x->klass(), tmp1, tmp2, tmp3, tmp4, klass_reg, info);
+ new_instance(reg, x->klass(), x->is_unresolved(), tmp1, tmp2, tmp3, tmp4, klass_reg, info);
LIR_Opr result = rlock_result(x);
__ move(reg, result);
}
--- a/hotspot/src/cpu/sparc/vm/compiledIC_sparc.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/cpu/sparc/vm/compiledIC_sparc.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -135,7 +135,7 @@
if (TraceICs) {
ResourceMark rm;
tty->print_cr("CompiledStaticCall@" INTPTR_FORMAT ": set_to_interpreted %s",
- instruction_address(),
+ p2i(instruction_address()),
callee->name_and_sig_as_C_string());
}
--- a/hotspot/src/cpu/sparc/vm/debug_sparc.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/cpu/sparc/vm/debug_sparc.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -42,20 +42,24 @@
intptr_t *pc = NULL;
intptr_t *next_pc = NULL;
int count = 0;
- tty->print("register window backtrace from %#x:\n", sp);
+ tty->print_cr("register window backtrace from " INTPTR_FORMAT ":", p2i(sp));
while (sp != NULL && ((intptr_t)sp & 7) == 0 && sp > prev_sp && sp < prev_sp+1000) {
pc = next_pc;
next_pc = (intptr_t*) sp[I7->sp_offset_in_saved_window()];
- tty->print("[%d] sp=%#x pc=", count, sp);
+ tty->print("[%d] sp=" INTPTR_FORMAT " pc=", count, p2i(sp));
findpc((intptr_t)pc);
if (WizardMode && Verbose) {
// print register window contents also
- tty->print_cr(" L0..L7: {%#x %#x %#x %#x %#x %#x %#x %#x}",
- sp[0+0],sp[0+1],sp[0+2],sp[0+3],
- sp[0+4],sp[0+5],sp[0+6],sp[0+7]);
- tty->print_cr(" I0..I7: {%#x %#x %#x %#x %#x %#x %#x %#x}",
- sp[8+0],sp[8+1],sp[8+2],sp[8+3],
- sp[8+4],sp[8+5],sp[8+6],sp[8+7]);
+ tty->print_cr(" L0..L7: {"
+ INTPTR_FORMAT " " INTPTR_FORMAT " " INTPTR_FORMAT " " INTPTR_FORMAT " "
+ INTPTR_FORMAT " " INTPTR_FORMAT " " INTPTR_FORMAT " " INTPTR_FORMAT " ",
+ sp[0+0], sp[0+1], sp[0+2], sp[0+3],
+ sp[0+4], sp[0+5], sp[0+6], sp[0+7]);
+ tty->print_cr(" I0..I7: {"
+ INTPTR_FORMAT " " INTPTR_FORMAT " " INTPTR_FORMAT " " INTPTR_FORMAT " "
+ INTPTR_FORMAT " " INTPTR_FORMAT " " INTPTR_FORMAT " " INTPTR_FORMAT " ",
+ sp[8+0], sp[8+1], sp[8+2], sp[8+3],
+ sp[8+4], sp[8+5], sp[8+6], sp[8+7]);
// (and print stack frame contents too??)
CodeBlob *b = CodeCache::find_blob((address) pc);
@@ -74,7 +78,7 @@
count += 1;
}
if (sp != NULL)
- tty->print("[%d] sp=%#x [bogus sp!]", count, sp);
+ tty->print("[%d] sp=" INTPTR_FORMAT " [bogus sp!]", count, p2i(sp));
}
#endif // PRODUCT
--- a/hotspot/src/cpu/sparc/vm/frame_sparc.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/cpu/sparc/vm/frame_sparc.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -557,7 +557,8 @@
// QQQ this assert is invalid (or too strong anyway) sice _pc could
// be original pc and frame could have the deopt pc.
// assert(_pc == *O7_addr() + pc_return_offset, "frame has wrong pc");
- tty->print_cr("patch_pc at address 0x%x [0x%x -> 0x%x] ", O7_addr(), _pc, pc);
+ tty->print_cr("patch_pc at address " INTPTR_FORMAT " [" INTPTR_FORMAT " -> " INTPTR_FORMAT "]",
+ p2i(O7_addr()), p2i(_pc), p2i(pc));
}
_cb = CodeCache::find_blob(pc);
*O7_addr() = pc - pc_return_offset;
--- a/hotspot/src/cpu/sparc/vm/macroAssembler_sparc.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/cpu/sparc/vm/macroAssembler_sparc.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -1202,7 +1202,7 @@
if ( j != last ) s->print(" - f%d", last);
s->print(" = %f", val);
s->fill_to(25);
- s->print_cr(" (0x%x)", val);
+ s->print_cr(" (0x%x)", *(int*)&val);
j = last + 1;
}
s->cr();
--- a/hotspot/src/cpu/sparc/vm/methodHandles_sparc.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/cpu/sparc/vm/methodHandles_sparc.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -483,7 +483,7 @@
const char* mh_reg_name = has_mh ? "G3_mh" : "G3";
tty->print_cr("MH %s %s="INTPTR_FORMAT " saved_sp=" INTPTR_FORMAT " args=" INTPTR_FORMAT,
adaptername, mh_reg_name,
- (intptr_t) mh, saved_sp, args);
+ p2i(mh), p2i(saved_sp), p2i(args));
if (Verbose) {
// dumping last frame with frame::describe
--- a/hotspot/src/cpu/sparc/vm/nativeInst_sparc.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/cpu/sparc/vm/nativeInst_sparc.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -78,7 +78,7 @@
}
void NativeInstruction::print() {
- tty->print_cr(INTPTR_FORMAT ": 0x%x", addr_at(0), long_at(0));
+ tty->print_cr(INTPTR_FORMAT ": 0x%x", p2i(addr_at(0)), long_at(0));
}
void NativeInstruction::set_long_at(int offset, int i) {
@@ -142,7 +142,7 @@
}
void NativeCall::print() {
- tty->print_cr(INTPTR_FORMAT ": call " INTPTR_FORMAT, instruction_address(), destination());
+ tty->print_cr(INTPTR_FORMAT ": call " INTPTR_FORMAT, p2i(instruction_address()), p2i(destination()));
}
@@ -271,7 +271,7 @@
}
void NativeFarCall::print() {
- tty->print_cr(INTPTR_FORMAT ": call " INTPTR_FORMAT, instruction_address(), destination());
+ tty->print_cr(INTPTR_FORMAT ": call " INTPTR_FORMAT, p2i(instruction_address()), p2i(destination()));
}
bool NativeFarCall::destination_is_compiled_verified_entry_point() {
@@ -324,7 +324,7 @@
void NativeMovConstReg::print() {
- tty->print_cr(INTPTR_FORMAT ": mov reg, " INTPTR_FORMAT, instruction_address(), data());
+ tty->print_cr(INTPTR_FORMAT ": mov reg, " INTPTR_FORMAT, p2i(instruction_address()), data());
}
@@ -446,7 +446,7 @@
void NativeMovConstRegPatching::print() {
- tty->print_cr(INTPTR_FORMAT ": mov reg, " INTPTR_FORMAT, instruction_address(), data());
+ tty->print_cr(INTPTR_FORMAT ": mov reg, 0x%x", p2i(instruction_address()), data());
}
@@ -585,9 +585,10 @@
void NativeMovRegMem::print() {
if (is_immediate()) {
- tty->print_cr(INTPTR_FORMAT ": mov reg, [reg + %x]", instruction_address(), offset());
+ // offset is a signed 13-bit immediate, so casting it to int will not lose significant bits
+ tty->print_cr(INTPTR_FORMAT ": mov reg, [reg + %d]", p2i(instruction_address()), (int)offset());
} else {
- tty->print_cr(INTPTR_FORMAT ": mov reg, [reg + reg]", instruction_address());
+ tty->print_cr(INTPTR_FORMAT ": mov reg, [reg + reg]", p2i(instruction_address()));
}
}
@@ -689,149 +690,6 @@
// End code for unit testing implementation of NativeMovRegMem class
-//--------------------------------------------------------------------------------
-
-
-void NativeMovRegMemPatching::copy_instruction_to(address new_instruction_address) {
- Untested("copy_instruction_to");
- int instruction_size = next_instruction_address() - instruction_address();
- for (int i = 0; i < instruction_size; i += wordSize) {
- *(long*)(new_instruction_address + i) = *(long*)(address(this) + i);
- }
-}
-
-
-void NativeMovRegMemPatching::verify() {
- NativeInstruction::verify();
- // make sure code pattern is actually a "ld" or "st" of some sort.
- int i0 = long_at(0);
- int op3 = inv_op3(i0);
-
- assert((int)nop_offset == (int)NativeMovConstReg::add_offset, "sethi size ok");
-
- if (!(is_op(i0, Assembler::ldst_op) &&
- inv_immed(i0) &&
- 0 != (op3 < op3_ldst_int_limit
- ? (1 << op3 ) & (op3_mask_ld | op3_mask_st)
- : (1 << (op3 - op3_ldst_int_limit)) & (op3_mask_ldf | op3_mask_stf)))) {
- int i1 = long_at(ldst_offset);
- Register rd = inv_rd(i0);
-
- op3 = inv_op3(i1);
- if (!is_op(i1, Assembler::ldst_op) && rd == inv_rs2(i1) &&
- 0 != (op3 < op3_ldst_int_limit
- ? (1 << op3 ) & (op3_mask_ld | op3_mask_st)
- : (1 << (op3 - op3_ldst_int_limit)) & (op3_mask_ldf | op3_mask_stf))) {
- fatal("not a ld* or st* op");
- }
- }
-}
-
-
-void NativeMovRegMemPatching::print() {
- if (is_immediate()) {
- tty->print_cr(INTPTR_FORMAT ": mov reg, [reg + %x]", instruction_address(), offset());
- } else {
- tty->print_cr(INTPTR_FORMAT ": mov reg, [reg + reg]", instruction_address());
- }
-}
-
-
-// Code for unit testing implementation of NativeMovRegMemPatching class
-void NativeMovRegMemPatching::test() {
-#ifdef ASSERT
- ResourceMark rm;
- CodeBuffer cb("test", 1000, 1000);
- MacroAssembler* a = new MacroAssembler(&cb);
- NativeMovRegMemPatching* nm;
- uint idx = 0;
- uint idx1;
- int offsets[] = {
- 0x0,
- 0xffffffff,
- 0x7fffffff,
- 0x80000000,
- 4096,
- 4097,
- 0x20,
- 0x4000,
- };
-
- VM_Version::allow_all();
-
- AddressLiteral al(0xffffffff, relocInfo::external_word_type);
- a->ldsw( G5, al.low10(), G4); idx++;
- a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3);
- a->ldsw( G5, I3, G4 ); idx++;
- a->ldsb( G5, al.low10(), G4); idx++;
- a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3);
- a->ldsb( G5, I3, G4 ); idx++;
- a->ldsh( G5, al.low10(), G4); idx++;
- a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3);
- a->ldsh( G5, I3, G4 ); idx++;
- a->lduw( G5, al.low10(), G4); idx++;
- a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3);
- a->lduw( G5, I3, G4 ); idx++;
- a->ldub( G5, al.low10(), G4); idx++;
- a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3);
- a->ldub( G5, I3, G4 ); idx++;
- a->lduh( G5, al.low10(), G4); idx++;
- a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3);
- a->lduh( G5, I3, G4 ); idx++;
- a->ldx( G5, al.low10(), G4); idx++;
- a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3);
- a->ldx( G5, I3, G4 ); idx++;
- a->ldd( G5, al.low10(), G4); idx++;
- a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3);
- a->ldd( G5, I3, G4 ); idx++;
- a->ldf( FloatRegisterImpl::D, O2, -1, F14 ); idx++;
- a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3);
- a->ldf( FloatRegisterImpl::S, O0, I3, F15 ); idx++;
-
- a->stw( G5, G4, al.low10()); idx++;
- a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3);
- a->stw( G5, G4, I3 ); idx++;
- a->stb( G5, G4, al.low10()); idx++;
- a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3);
- a->stb( G5, G4, I3 ); idx++;
- a->sth( G5, G4, al.low10()); idx++;
- a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3);
- a->sth( G5, G4, I3 ); idx++;
- a->stx( G5, G4, al.low10()); idx++;
- a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3);
- a->stx( G5, G4, I3 ); idx++;
- a->std( G5, G4, al.low10()); idx++;
- a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3);
- a->std( G5, G4, I3 ); idx++;
- a->stf( FloatRegisterImpl::S, F18, O2, -1 ); idx++;
- a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3);
- a->stf( FloatRegisterImpl::S, F15, O0, I3 ); idx++;
-
- nm = nativeMovRegMemPatching_at( cb.insts_begin() );
- nm->print();
- nm->set_offset( low10(0) );
- nm->print();
- nm->add_offset_in_bytes( low10(0xbb) * wordSize );
- nm->print();
-
- while (--idx) {
- nm = nativeMovRegMemPatching_at( nm->next_instruction_address() );
- nm->print();
- for (idx1 = 0; idx1 < ARRAY_SIZE(offsets); idx1++) {
- nm->set_offset( nm->is_immediate() ? low10(offsets[idx1]) : offsets[idx1] );
- assert(nm->offset() == (nm->is_immediate() ? low10(offsets[idx1]) : offsets[idx1]),
- "check unit test");
- nm->print();
- }
- nm->add_offset_in_bytes( low10(0xbb) * wordSize );
- nm->print();
- }
-
- VM_Version::revert();
-#endif // ASSERT
-}
-// End code for unit testing implementation of NativeMovRegMemPatching class
-
//--------------------------------------------------------------------------------
@@ -863,7 +721,7 @@
void NativeJump::print() {
- tty->print_cr(INTPTR_FORMAT ": jmpl reg, " INTPTR_FORMAT, instruction_address(), jump_destination());
+ tty->print_cr(INTPTR_FORMAT ": jmpl reg, " INTPTR_FORMAT, p2i(instruction_address()), p2i(jump_destination()));
}
--- a/hotspot/src/cpu/sparc/vm/nativeInst_sparc.hpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/cpu/sparc/vm/nativeInst_sparc.hpp Wed Jul 05 19:46:31 2017 +0200
@@ -38,7 +38,6 @@
// - - NativeMovConstReg
// - - NativeMovConstRegPatching
// - - NativeMovRegMem
-// - - NativeMovRegMemPatching
// - - NativeJump
// - - NativeGeneralJump
// - - NativeIllegalInstruction
@@ -710,96 +709,6 @@
};
-// An interface for accessing/manipulating native memory ops
-// ld* [reg + offset], reg
-// st* reg, [reg + offset]
-// sethi %hi(imm), reg; nop; add reg, %lo(imm), reg; ld* [reg1 + reg], reg2
-// sethi %hi(imm), reg; nop; add reg, %lo(imm), reg; st* reg2, [reg1 + reg]
-// Ops covered: {lds,ldu,st}{w,b,h}, {ld,st}{d,x}
-//
-// Note that it is identical to NativeMovRegMem with the exception of a nop between the
-// sethi and the add. The nop is required to be in the delay slot of the call instruction
-// which overwrites the sethi during patching.
-class NativeMovRegMemPatching;
-inline NativeMovRegMemPatching* nativeMovRegMemPatching_at (address address);
-class NativeMovRegMemPatching: public NativeInstruction {
- public:
- enum Sparc_specific_constants {
- op3_mask_ld = 1 << Assembler::lduw_op3 |
- 1 << Assembler::ldub_op3 |
- 1 << Assembler::lduh_op3 |
- 1 << Assembler::ldd_op3 |
- 1 << Assembler::ldsw_op3 |
- 1 << Assembler::ldsb_op3 |
- 1 << Assembler::ldsh_op3 |
- 1 << Assembler::ldx_op3,
- op3_mask_st = 1 << Assembler::stw_op3 |
- 1 << Assembler::stb_op3 |
- 1 << Assembler::sth_op3 |
- 1 << Assembler::std_op3 |
- 1 << Assembler::stx_op3,
- op3_ldst_int_limit = Assembler::ldf_op3,
- op3_mask_ldf = 1 << (Assembler::ldf_op3 - op3_ldst_int_limit) |
- 1 << (Assembler::lddf_op3 - op3_ldst_int_limit),
- op3_mask_stf = 1 << (Assembler::stf_op3 - op3_ldst_int_limit) |
- 1 << (Assembler::stdf_op3 - op3_ldst_int_limit),
-
- offset_width = 13,
- sethi_offset = 0,
-#ifdef _LP64
- nop_offset = 7 * BytesPerInstWord,
-#else
- nop_offset = 4,
-#endif
- add_offset = nop_offset + BytesPerInstWord,
- ldst_offset = add_offset + BytesPerInstWord
- };
- bool is_immediate() const {
- // check if instruction is ld* [reg + offset], reg or st* reg, [reg + offset]
- int i0 = long_at(0);
- return (is_op(i0, Assembler::ldst_op));
- }
-
- address instruction_address() const { return addr_at(0); }
- address next_instruction_address() const {
- return addr_at(is_immediate()? 4 : 16);
- }
- int offset() const {
- return is_immediate()? inv_simm(long_at(0), offset_width) :
- nativeMovConstRegPatching_at(addr_at(0))->data();
- }
- void set_offset(int x) {
- if (is_immediate()) {
- guarantee(fits_in_simm(x, offset_width), "data block offset overflow");
- set_long_at(0, set_simm(long_at(0), x, offset_width));
- }
- else
- nativeMovConstRegPatching_at(addr_at(0))->set_data(x);
- }
-
- void add_offset_in_bytes(intptr_t radd_offset) {
- set_offset (offset() + radd_offset);
- }
-
- void copy_instruction_to(address new_instruction_address);
-
- void verify();
- void print ();
-
- // unit test stuff
- static void test();
-
- private:
- friend inline NativeMovRegMemPatching* nativeMovRegMemPatching_at (address address) {
- NativeMovRegMemPatching* test = (NativeMovRegMemPatching*)address;
- #ifdef ASSERT
- test->verify();
- #endif
- return test;
- }
-};
-
-
// An interface for accessing/manipulating native jumps
// jump_to addr
// == sethi %hi22(addr), temp ; jumpl reg, %lo10(addr), G0 ; <delay>
--- a/hotspot/src/cpu/sparc/vm/sparc.ad Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/cpu/sparc/vm/sparc.ad Wed Jul 05 19:46:31 2017 +0200
@@ -1206,10 +1206,10 @@
}
if (Assembler::is_simm13(-framesize)) {
- st->print ("SAVE R_SP,-%d,R_SP",framesize);
+ st->print ("SAVE R_SP,-" SIZE_FORMAT ",R_SP",framesize);
} else {
- st->print_cr("SETHI R_SP,hi%%(-%d),R_G3",framesize); st->print("\t");
- st->print_cr("ADD R_G3,lo%%(-%d),R_G3",framesize); st->print("\t");
+ st->print_cr("SETHI R_SP,hi%%(-" SIZE_FORMAT "),R_G3",framesize); st->print("\t");
+ st->print_cr("ADD R_G3,lo%%(-" SIZE_FORMAT "),R_G3",framesize); st->print("\t");
st->print ("SAVE R_SP,R_G3,R_SP");
}
--- a/hotspot/src/cpu/sparc/vm/stubGenerator_sparc.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/cpu/sparc/vm/stubGenerator_sparc.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -4575,6 +4575,219 @@
return start;
}
+ address generate_sha1_implCompress(bool multi_block, const char *name) {
+ __ align(CodeEntryAlignment);
+ StubCodeMark mark(this, "StubRoutines", name);
+ address start = __ pc();
+
+ Label L_sha1_loop, L_sha1_unaligned_input, L_sha1_unaligned_input_loop;
+ int i;
+
+ Register buf = O0; // byte[] source+offset
+ Register state = O1; // int[] SHA.state
+ Register ofs = O2; // int offset
+ Register limit = O3; // int limit
+
+ // load state into F0-F4
+ for (i = 0; i < 5; i++) {
+ __ ldf(FloatRegisterImpl::S, state, i*4, as_FloatRegister(i));
+ }
+
+ __ andcc(buf, 7, G0);
+ __ br(Assembler::notZero, false, Assembler::pn, L_sha1_unaligned_input);
+ __ delayed()->nop();
+
+ __ BIND(L_sha1_loop);
+ // load buf into F8-F22
+ for (i = 0; i < 8; i++) {
+ __ ldf(FloatRegisterImpl::D, buf, i*8, as_FloatRegister(i*2 + 8));
+ }
+ __ sha1();
+ if (multi_block) {
+ __ add(ofs, 64, ofs);
+ __ add(buf, 64, buf);
+ __ cmp_and_brx_short(ofs, limit, Assembler::lessEqual, Assembler::pt, L_sha1_loop);
+ __ mov(ofs, O0); // to be returned
+ }
+
+ // store F0-F4 into state and return
+ for (i = 0; i < 4; i++) {
+ __ stf(FloatRegisterImpl::S, as_FloatRegister(i), state, i*4);
+ }
+ __ retl();
+ __ delayed()->stf(FloatRegisterImpl::S, F4, state, 0x10);
+
+ __ BIND(L_sha1_unaligned_input);
+ __ alignaddr(buf, G0, buf);
+
+ __ BIND(L_sha1_unaligned_input_loop);
+ // load buf into F8-F22
+ for (i = 0; i < 9; i++) {
+ __ ldf(FloatRegisterImpl::D, buf, i*8, as_FloatRegister(i*2 + 8));
+ }
+ for (i = 0; i < 8; i++) {
+ __ faligndata(as_FloatRegister(i*2 + 8), as_FloatRegister(i*2 + 10), as_FloatRegister(i*2 + 8));
+ }
+ __ sha1();
+ if (multi_block) {
+ __ add(ofs, 64, ofs);
+ __ add(buf, 64, buf);
+ __ cmp_and_brx_short(ofs, limit, Assembler::lessEqual, Assembler::pt, L_sha1_unaligned_input_loop);
+ __ mov(ofs, O0); // to be returned
+ }
+
+ // store F0-F4 into state and return
+ for (i = 0; i < 4; i++) {
+ __ stf(FloatRegisterImpl::S, as_FloatRegister(i), state, i*4);
+ }
+ __ retl();
+ __ delayed()->stf(FloatRegisterImpl::S, F4, state, 0x10);
+
+ return start;
+ }
+
+ address generate_sha256_implCompress(bool multi_block, const char *name) {
+ __ align(CodeEntryAlignment);
+ StubCodeMark mark(this, "StubRoutines", name);
+ address start = __ pc();
+
+ Label L_sha256_loop, L_sha256_unaligned_input, L_sha256_unaligned_input_loop;
+ int i;
+
+ Register buf = O0; // byte[] source+offset
+ Register state = O1; // int[] SHA2.state
+ Register ofs = O2; // int offset
+ Register limit = O3; // int limit
+
+ // load state into F0-F7
+ for (i = 0; i < 8; i++) {
+ __ ldf(FloatRegisterImpl::S, state, i*4, as_FloatRegister(i));
+ }
+
+ __ andcc(buf, 7, G0);
+ __ br(Assembler::notZero, false, Assembler::pn, L_sha256_unaligned_input);
+ __ delayed()->nop();
+
+ __ BIND(L_sha256_loop);
+ // load buf into F8-F22
+ for (i = 0; i < 8; i++) {
+ __ ldf(FloatRegisterImpl::D, buf, i*8, as_FloatRegister(i*2 + 8));
+ }
+ __ sha256();
+ if (multi_block) {
+ __ add(ofs, 64, ofs);
+ __ add(buf, 64, buf);
+ __ cmp_and_brx_short(ofs, limit, Assembler::lessEqual, Assembler::pt, L_sha256_loop);
+ __ mov(ofs, O0); // to be returned
+ }
+
+ // store F0-F7 into state and return
+ for (i = 0; i < 7; i++) {
+ __ stf(FloatRegisterImpl::S, as_FloatRegister(i), state, i*4);
+ }
+ __ retl();
+ __ delayed()->stf(FloatRegisterImpl::S, F7, state, 0x1c);
+
+ __ BIND(L_sha256_unaligned_input);
+ __ alignaddr(buf, G0, buf);
+
+ __ BIND(L_sha256_unaligned_input_loop);
+ // load buf into F8-F22
+ for (i = 0; i < 9; i++) {
+ __ ldf(FloatRegisterImpl::D, buf, i*8, as_FloatRegister(i*2 + 8));
+ }
+ for (i = 0; i < 8; i++) {
+ __ faligndata(as_FloatRegister(i*2 + 8), as_FloatRegister(i*2 + 10), as_FloatRegister(i*2 + 8));
+ }
+ __ sha256();
+ if (multi_block) {
+ __ add(ofs, 64, ofs);
+ __ add(buf, 64, buf);
+ __ cmp_and_brx_short(ofs, limit, Assembler::lessEqual, Assembler::pt, L_sha256_unaligned_input_loop);
+ __ mov(ofs, O0); // to be returned
+ }
+
+ // store F0-F7 into state and return
+ for (i = 0; i < 7; i++) {
+ __ stf(FloatRegisterImpl::S, as_FloatRegister(i), state, i*4);
+ }
+ __ retl();
+ __ delayed()->stf(FloatRegisterImpl::S, F7, state, 0x1c);
+
+ return start;
+ }
+
+ address generate_sha512_implCompress(bool multi_block, const char *name) {
+ __ align(CodeEntryAlignment);
+ StubCodeMark mark(this, "StubRoutines", name);
+ address start = __ pc();
+
+ Label L_sha512_loop, L_sha512_unaligned_input, L_sha512_unaligned_input_loop;
+ int i;
+
+ Register buf = O0; // byte[] source+offset
+ Register state = O1; // long[] SHA5.state
+ Register ofs = O2; // int offset
+ Register limit = O3; // int limit
+
+ // load state into F0-F14
+ for (i = 0; i < 8; i++) {
+ __ ldf(FloatRegisterImpl::D, state, i*8, as_FloatRegister(i*2));
+ }
+
+ __ andcc(buf, 7, G0);
+ __ br(Assembler::notZero, false, Assembler::pn, L_sha512_unaligned_input);
+ __ delayed()->nop();
+
+ __ BIND(L_sha512_loop);
+ // load buf into F16-F46
+ for (i = 0; i < 16; i++) {
+ __ ldf(FloatRegisterImpl::D, buf, i*8, as_FloatRegister(i*2 + 16));
+ }
+ __ sha512();
+ if (multi_block) {
+ __ add(ofs, 128, ofs);
+ __ add(buf, 128, buf);
+ __ cmp_and_brx_short(ofs, limit, Assembler::lessEqual, Assembler::pt, L_sha512_loop);
+ __ mov(ofs, O0); // to be returned
+ }
+
+ // store F0-F14 into state and return
+ for (i = 0; i < 7; i++) {
+ __ stf(FloatRegisterImpl::D, as_FloatRegister(i*2), state, i*8);
+ }
+ __ retl();
+ __ delayed()->stf(FloatRegisterImpl::D, F14, state, 0x38);
+
+ __ BIND(L_sha512_unaligned_input);
+ __ alignaddr(buf, G0, buf);
+
+ __ BIND(L_sha512_unaligned_input_loop);
+ // load buf into F16-F46
+ for (i = 0; i < 17; i++) {
+ __ ldf(FloatRegisterImpl::D, buf, i*8, as_FloatRegister(i*2 + 16));
+ }
+ for (i = 0; i < 16; i++) {
+ __ faligndata(as_FloatRegister(i*2 + 16), as_FloatRegister(i*2 + 18), as_FloatRegister(i*2 + 16));
+ }
+ __ sha512();
+ if (multi_block) {
+ __ add(ofs, 128, ofs);
+ __ add(buf, 128, buf);
+ __ cmp_and_brx_short(ofs, limit, Assembler::lessEqual, Assembler::pt, L_sha512_unaligned_input_loop);
+ __ mov(ofs, O0); // to be returned
+ }
+
+ // store F0-F14 into state and return
+ for (i = 0; i < 7; i++) {
+ __ stf(FloatRegisterImpl::D, as_FloatRegister(i*2), state, i*8);
+ }
+ __ retl();
+ __ delayed()->stf(FloatRegisterImpl::D, F14, state, 0x38);
+
+ return start;
+ }
+
void generate_initial() {
// Generates all stubs and initializes the entry points
@@ -4647,6 +4860,20 @@
StubRoutines::_cipherBlockChaining_encryptAESCrypt = generate_cipherBlockChaining_encryptAESCrypt();
StubRoutines::_cipherBlockChaining_decryptAESCrypt = generate_cipherBlockChaining_decryptAESCrypt_Parallel();
}
+
+ // generate SHA1/SHA256/SHA512 intrinsics code
+ if (UseSHA1Intrinsics) {
+ StubRoutines::_sha1_implCompress = generate_sha1_implCompress(false, "sha1_implCompress");
+ StubRoutines::_sha1_implCompressMB = generate_sha1_implCompress(true, "sha1_implCompressMB");
+ }
+ if (UseSHA256Intrinsics) {
+ StubRoutines::_sha256_implCompress = generate_sha256_implCompress(false, "sha256_implCompress");
+ StubRoutines::_sha256_implCompressMB = generate_sha256_implCompress(true, "sha256_implCompressMB");
+ }
+ if (UseSHA512Intrinsics) {
+ StubRoutines::_sha512_implCompress = generate_sha512_implCompress(false, "sha512_implCompress");
+ StubRoutines::_sha512_implCompressMB = generate_sha512_implCompress(true, "sha512_implCompressMB");
+ }
}
--- a/hotspot/src/cpu/sparc/vm/stubRoutines_sparc.hpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/cpu/sparc/vm/stubRoutines_sparc.hpp Wed Jul 05 19:46:31 2017 +0200
@@ -41,7 +41,7 @@
enum /* platform_dependent_constants */ {
// %%%%%%%% May be able to shrink this a lot
code_size1 = 20000, // simply increase if too small (assembler will crash if too small)
- code_size2 = 22000 // simply increase if too small (assembler will crash if too small)
+ code_size2 = 23000 // simply increase if too small (assembler will crash if too small)
};
class Sparc {
--- a/hotspot/src/cpu/sparc/vm/templateInterpreter_sparc.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/cpu/sparc/vm/templateInterpreter_sparc.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -1722,15 +1722,15 @@
if (caller->is_interpreted_frame()) {
tty->print("interpreted ");
}
- tty->print_cr("caller fp=0x%x sp=0x%x", caller->fp(), caller->sp());
- tty->print_cr("save area = 0x%x, 0x%x", caller->sp(), caller->sp() + 16);
- tty->print_cr("save area = 0x%x, 0x%x", caller->fp(), caller->fp() + 16);
- tty->print_cr("interpreter fp=0x%x sp=0x%x", interpreter_frame->fp(), interpreter_frame->sp());
- tty->print_cr("save area = 0x%x, 0x%x", interpreter_frame->sp(), interpreter_frame->sp() + 16);
- tty->print_cr("save area = 0x%x, 0x%x", interpreter_frame->fp(), interpreter_frame->fp() + 16);
- tty->print_cr("Llocals = 0x%x", locals);
- tty->print_cr("Lesp = 0x%x", esp);
- tty->print_cr("Lmonitors = 0x%x", monitors);
+ tty->print_cr("caller fp=" INTPTR_FORMAT " sp=" INTPTR_FORMAT, p2i(caller->fp()), p2i(caller->sp()));
+ tty->print_cr("save area = " INTPTR_FORMAT ", " INTPTR_FORMAT, p2i(caller->sp()), p2i(caller->sp() + 16));
+ tty->print_cr("save area = " INTPTR_FORMAT ", " INTPTR_FORMAT, p2i(caller->fp()), p2i(caller->fp() + 16));
+ tty->print_cr("interpreter fp=" INTPTR_FORMAT ", " INTPTR_FORMAT, p2i(interpreter_frame->fp()), p2i(interpreter_frame->sp()));
+ tty->print_cr("save area = " INTPTR_FORMAT ", " INTPTR_FORMAT, p2i(interpreter_frame->sp()), p2i(interpreter_frame->sp() + 16));
+ tty->print_cr("save area = " INTPTR_FORMAT ", " INTPTR_FORMAT, p2i(interpreter_frame->fp()), p2i(interpreter_frame->fp() + 16));
+ tty->print_cr("Llocals = " INTPTR_FORMAT, p2i(locals));
+ tty->print_cr("Lesp = " INTPTR_FORMAT, p2i(esp));
+ tty->print_cr("Lmonitors = " INTPTR_FORMAT, p2i(monitors));
}
if (method->max_locals() > 0) {
--- a/hotspot/src/cpu/sparc/vm/vm_version_sparc.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/cpu/sparc/vm/vm_version_sparc.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -234,7 +234,7 @@
assert((OptoLoopAlignment % relocInfo::addr_unit()) == 0, "alignment is not a multiple of NOP size");
char buf[512];
- jio_snprintf(buf, sizeof(buf), "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
+ jio_snprintf(buf, sizeof(buf), "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
(has_v9() ? ", v9" : (has_v8() ? ", v8" : "")),
(has_hardware_popc() ? ", popc" : ""),
(has_vis1() ? ", vis1" : ""),
@@ -243,6 +243,9 @@
(has_blk_init() ? ", blk_init" : ""),
(has_cbcond() ? ", cbcond" : ""),
(has_aes() ? ", aes" : ""),
+ (has_sha1() ? ", sha1" : ""),
+ (has_sha256() ? ", sha256" : ""),
+ (has_sha512() ? ", sha512" : ""),
(is_ultra3() ? ", ultra3" : ""),
(is_sun4v() ? ", sun4v" : ""),
(is_niagara_plus() ? ", niagara_plus" : (is_niagara() ? ", niagara" : "")),
@@ -301,6 +304,58 @@
}
}
+ // SHA1, SHA256, and SHA512 instructions were added to SPARC T-series at different times
+ if (has_sha1() || has_sha256() || has_sha512()) {
+ if (UseVIS > 0) { // SHA intrinsics use VIS1 instructions
+ if (FLAG_IS_DEFAULT(UseSHA)) {
+ FLAG_SET_DEFAULT(UseSHA, true);
+ }
+ } else {
+ if (UseSHA) {
+ warning("SPARC SHA intrinsics require VIS1 instruction support. Intrinsics will be disabled.");
+ FLAG_SET_DEFAULT(UseSHA, false);
+ }
+ }
+ } else if (UseSHA) {
+ warning("SHA instructions are not available on this CPU");
+ FLAG_SET_DEFAULT(UseSHA, false);
+ }
+
+ if (!UseSHA) {
+ FLAG_SET_DEFAULT(UseSHA1Intrinsics, false);
+ FLAG_SET_DEFAULT(UseSHA256Intrinsics, false);
+ FLAG_SET_DEFAULT(UseSHA512Intrinsics, false);
+ } else {
+ if (has_sha1()) {
+ if (FLAG_IS_DEFAULT(UseSHA1Intrinsics)) {
+ FLAG_SET_DEFAULT(UseSHA1Intrinsics, true);
+ }
+ } else if (UseSHA1Intrinsics) {
+ warning("SHA1 instruction is not available on this CPU.");
+ FLAG_SET_DEFAULT(UseSHA1Intrinsics, false);
+ }
+ if (has_sha256()) {
+ if (FLAG_IS_DEFAULT(UseSHA256Intrinsics)) {
+ FLAG_SET_DEFAULT(UseSHA256Intrinsics, true);
+ }
+ } else if (UseSHA256Intrinsics) {
+ warning("SHA256 instruction (for SHA-224 and SHA-256) is not available on this CPU.");
+ FLAG_SET_DEFAULT(UseSHA256Intrinsics, false);
+ }
+
+ if (has_sha512()) {
+ if (FLAG_IS_DEFAULT(UseSHA512Intrinsics)) {
+ FLAG_SET_DEFAULT(UseSHA512Intrinsics, true);
+ }
+ } else if (UseSHA512Intrinsics) {
+ warning("SHA512 instruction (for SHA-384 and SHA-512) is not available on this CPU.");
+ FLAG_SET_DEFAULT(UseSHA512Intrinsics, false);
+ }
+ if (!(UseSHA1Intrinsics || UseSHA256Intrinsics || UseSHA512Intrinsics)) {
+ FLAG_SET_DEFAULT(UseSHA, false);
+ }
+ }
+
if (FLAG_IS_DEFAULT(ContendedPaddingWidth) &&
(cache_line_size > ContendedPaddingWidth))
ContendedPaddingWidth = cache_line_size;
--- a/hotspot/src/cpu/sparc/vm/vm_version_sparc.hpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/cpu/sparc/vm/vm_version_sparc.hpp Wed Jul 05 19:46:31 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
@@ -50,7 +50,10 @@
T_family = 16,
T1_model = 17,
sparc5_instructions = 18,
- aes_instructions = 19
+ aes_instructions = 19,
+ sha1_instruction = 20,
+ sha256_instruction = 21,
+ sha512_instruction = 22
};
enum Feature_Flag_Set {
@@ -77,6 +80,9 @@
T1_model_m = 1 << T1_model,
sparc5_instructions_m = 1 << sparc5_instructions,
aes_instructions_m = 1 << aes_instructions,
+ sha1_instruction_m = 1 << sha1_instruction,
+ sha256_instruction_m = 1 << sha256_instruction,
+ sha512_instruction_m = 1 << sha512_instruction,
generic_v8_m = v8_instructions_m | hardware_mul32_m | hardware_div32_m | hardware_fsmuld_m,
generic_v9_m = generic_v8_m | v9_instructions_m,
@@ -129,6 +135,9 @@
static bool has_cbcond() { return (_features & cbcond_instructions_m) != 0; }
static bool has_sparc5_instr() { return (_features & sparc5_instructions_m) != 0; }
static bool has_aes() { return (_features & aes_instructions_m) != 0; }
+ static bool has_sha1() { return (_features & sha1_instruction_m) != 0; }
+ static bool has_sha256() { return (_features & sha256_instruction_m) != 0; }
+ static bool has_sha512() { return (_features & sha512_instruction_m) != 0; }
static bool supports_compare_and_exchange()
{ return has_v9(); }
--- a/hotspot/src/cpu/sparc/vm/vtableStubs_sparc.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/cpu/sparc/vm/vtableStubs_sparc.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -111,7 +111,7 @@
if (PrintMiscellaneous && (WizardMode || Verbose)) {
tty->print_cr("vtable #%d at "PTR_FORMAT"[%d] left over: %d",
- vtable_index, s->entry_point(),
+ vtable_index, p2i(s->entry_point()),
(int)(s->code_end() - s->entry_point()),
(int)(s->code_end() - __ pc()));
}
@@ -206,7 +206,7 @@
if (PrintMiscellaneous && (WizardMode || Verbose)) {
tty->print_cr("itable #%d at "PTR_FORMAT"[%d] left over: %d",
- itable_index, s->entry_point(),
+ itable_index, p2i(s->entry_point()),
(int)(s->code_end() - s->entry_point()),
(int)(s->code_end() - __ pc()));
}
--- a/hotspot/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -1085,14 +1085,11 @@
void LIRGenerator::do_NewInstance(NewInstance* x) {
-#ifndef PRODUCT
- if (PrintNotLoaded && !x->klass()->is_loaded()) {
- tty->print_cr(" ###class not loaded at new bci %d", x->printable_bci());
- }
-#endif
+ print_if_not_loaded(x);
+
CodeEmitInfo* info = state_for(x, x->state());
LIR_Opr reg = result_register_for(x->type());
- new_instance(reg, x->klass(),
+ new_instance(reg, x->klass(), x->is_unresolved(),
FrameMap::rcx_oop_opr,
FrameMap::rdi_oop_opr,
FrameMap::rsi_oop_opr,
--- a/hotspot/src/cpu/x86/vm/nativeInst_x86.hpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/cpu/x86/vm/nativeInst_x86.hpp Wed Jul 05 19:46:31 2017 +0200
@@ -327,18 +327,6 @@
return test;
}
-class NativeMovRegMemPatching: public NativeMovRegMem {
- private:
- friend NativeMovRegMemPatching* nativeMovRegMemPatching_at (address address) {
- NativeMovRegMemPatching* test = (NativeMovRegMemPatching*)(address - instruction_offset);
- #ifdef ASSERT
- test->verify();
- #endif
- return test;
- }
-};
-
-
// An interface for accessing/manipulating native leal instruction of form:
// leal reg, [reg + offset]
--- a/hotspot/src/cpu/x86/vm/vm_version_x86.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/cpu/x86/vm/vm_version_x86.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -590,6 +590,17 @@
FLAG_SET_DEFAULT(UseAESIntrinsics, false);
}
+ if (UseSHA) {
+ warning("SHA instructions are not available on this CPU");
+ FLAG_SET_DEFAULT(UseSHA, false);
+ }
+ if (UseSHA1Intrinsics || UseSHA256Intrinsics || UseSHA512Intrinsics) {
+ warning("SHA intrinsics are not available on this CPU");
+ FLAG_SET_DEFAULT(UseSHA1Intrinsics, false);
+ FLAG_SET_DEFAULT(UseSHA256Intrinsics, false);
+ FLAG_SET_DEFAULT(UseSHA512Intrinsics, false);
+ }
+
// Adjust RTM (Restricted Transactional Memory) flags
if (!supports_rtm() && UseRTMLocking) {
// Can't continue because UseRTMLocking affects UseBiasedLocking flag
--- a/hotspot/src/cpu/x86/vm/x86_32.ad Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/cpu/x86/vm/x86_32.ad Wed Jul 05 19:46:31 2017 +0200
@@ -1401,22 +1401,22 @@
// No transformation necessary.
return;
case INDIRECT:
- new_memory = new (C) indirect_win95_safeOper( );
+ new_memory = new indirect_win95_safeOper( );
break;
case INDOFFSET8:
- new_memory = new (C) indOffset8_win95_safeOper(memory->disp(NULL, NULL, 0));
+ new_memory = new indOffset8_win95_safeOper(memory->disp(NULL, NULL, 0));
break;
case INDOFFSET32:
- new_memory = new (C) indOffset32_win95_safeOper(memory->disp(NULL, NULL, 0));
+ new_memory = new indOffset32_win95_safeOper(memory->disp(NULL, NULL, 0));
break;
case INDINDEXOFFSET:
- new_memory = new (C) indIndexOffset_win95_safeOper(memory->disp(NULL, NULL, 0));
+ new_memory = new indIndexOffset_win95_safeOper(memory->disp(NULL, NULL, 0));
break;
case INDINDEXSCALE:
- new_memory = new (C) indIndexScale_win95_safeOper(memory->scale());
+ new_memory = new indIndexScale_win95_safeOper(memory->scale());
break;
case INDINDEXSCALEOFFSET:
- new_memory = new (C) indIndexScaleOffset_win95_safeOper(memory->scale(), memory->disp(NULL, NULL, 0));
+ new_memory = new indIndexScaleOffset_win95_safeOper(memory->scale(), memory->disp(NULL, NULL, 0));
break;
case LOAD_LONG_INDIRECT:
case LOAD_LONG_INDOFFSET32:
--- a/hotspot/src/os/aix/vm/os_aix.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/os/aix/vm/os_aix.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -4734,10 +4734,8 @@
//
// Thread.interrupt and object.notify{All} both call Event::set.
// That is, we treat thread.interrupt as a special case of notification.
- // The underlying Solaris implementation, cond_timedwait, admits
- // spurious/premature wakeups, but the JLS/JVM spec prevents the
- // JVM from making those visible to Java code. As such, we must
- // filter out spurious wakeups. We assume all ETIME returns are valid.
+ // We ignore spurious OS wakeups unless FilterSpuriousWakeups is false.
+ // We assume all ETIME returns are valid.
//
// TODO: properly differentiate simultaneous notify+interrupt.
// In that case, we should propagate the notify to another waiter.
--- a/hotspot/src/os/bsd/vm/os_bsd.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/os/bsd/vm/os_bsd.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -4299,10 +4299,8 @@
//
// Thread.interrupt and object.notify{All} both call Event::set.
// That is, we treat thread.interrupt as a special case of notification.
- // The underlying Solaris implementation, cond_timedwait, admits
- // spurious/premature wakeups, but the JLS/JVM spec prevents the
- // JVM from making those visible to Java code. As such, we must
- // filter out spurious wakeups. We assume all ETIME returns are valid.
+ // We ignore spurious OS wakeups unless FilterSpuriousWakeups is false.
+ // We assume all ETIME returns are valid.
//
// TODO: properly differentiate simultaneous notify+interrupt.
// In that case, we should propagate the notify to another waiter.
--- a/hotspot/src/os/linux/vm/os_linux.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/os/linux/vm/os_linux.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -5538,10 +5538,8 @@
//
// Thread.interrupt and object.notify{All} both call Event::set.
// That is, we treat thread.interrupt as a special case of notification.
- // The underlying Solaris implementation, cond_timedwait, admits
- // spurious/premature wakeups, but the JLS/JVM spec prevents the
- // JVM from making those visible to Java code. As such, we must
- // filter out spurious wakeups. We assume all ETIME returns are valid.
+ // We ignore spurious OS wakeups unless FilterSpuriousWakeups is false.
+ // We assume all ETIME returns are valid.
//
// TODO: properly differentiate simultaneous notify+interrupt.
// In that case, we should propagate the notify to another waiter.
--- a/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -234,7 +234,7 @@
SIG_REGS(sc).u_regs[CON_G3],
SIG_REGS(sc).u_regs[CON_G4]);
st->print_cr(" G5=" INTPTR_FORMAT " G6=" INTPTR_FORMAT
- " G7=" INTPTR_FORMAT " Y=" INTPTR_FORMAT,
+ " G7=" INTPTR_FORMAT " Y=0x%x",
SIG_REGS(sc).u_regs[CON_G5],
SIG_REGS(sc).u_regs[CON_G6],
SIG_REGS(sc).u_regs[CON_G7],
@@ -285,7 +285,7 @@
st->cr();
st->cr();
- st->print_cr("Top of Stack: (sp=" PTR_FORMAT ")", sp);
+ st->print_cr("Top of Stack: (sp=" INTPTR_FORMAT ")", p2i(sp));
print_hex_dump(st, (address)sp, (address)(sp + 32), sizeof(intptr_t));
st->cr();
@@ -293,7 +293,7 @@
// point to garbage if entry point in an nmethod is corrupted. Leave
// this at the end, and hope for the best.
address pc = os::Linux::ucontext_get_pc(uc);
- st->print_cr("Instructions: (pc=" PTR_FORMAT ")", pc);
+ st->print_cr("Instructions: (pc=" INTPTR_FORMAT ")", p2i(pc));
print_hex_dump(st, pc - 32, pc + 32, sizeof(char));
}
@@ -453,7 +453,7 @@
&& pc < MacroAssembler::_verify_oop_implicit_branch[1] ) {
*stub = MacroAssembler::_verify_oop_implicit_branch[2];
warning("fixed up memory fault in +VerifyOops at address "
- INTPTR_FORMAT, fault);
+ INTPTR_FORMAT, p2i(fault));
return true;
}
return false;
--- a/hotspot/src/os_cpu/linux_sparc/vm/vm_version_linux_sparc.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/os_cpu/linux_sparc/vm/vm_version_linux_sparc.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -36,7 +36,7 @@
}
while (!feof(fp)) {
- if (fscanf(fp, "cpu\t\t: %100[^\n]", &cpu) == 1) {
+ if (fscanf(fp, "cpu\t\t: %100[^\n]", cpu) == 1) {
if (strstr(cpu, "Niagara") != NULL) {
rv = true;
}
--- a/hotspot/src/os_cpu/solaris_sparc/vm/vm_version_solaris_sparc.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/os_cpu/solaris_sparc/vm/vm_version_solaris_sparc.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006, 2012, 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
@@ -137,6 +137,21 @@
#endif
if (av & AV_SPARC_AES) features |= aes_instructions_m;
+#ifndef AV_SPARC_SHA1
+#define AV_SPARC_SHA1 0x00400000 /* sha1 instruction supported */
+#endif
+ if (av & AV_SPARC_SHA1) features |= sha1_instruction_m;
+
+#ifndef AV_SPARC_SHA256
+#define AV_SPARC_SHA256 0x00800000 /* sha256 instruction supported */
+#endif
+ if (av & AV_SPARC_SHA256) features |= sha256_instruction_m;
+
+#ifndef AV_SPARC_SHA512
+#define AV_SPARC_SHA512 0x01000000 /* sha512 instruction supported */
+#endif
+ if (av & AV_SPARC_SHA512) features |= sha512_instruction_m;
+
} else {
// getisax(2) failed, use the old legacy code.
#ifndef PRODUCT
--- a/hotspot/src/share/vm/adlc/output_c.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/adlc/output_c.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -1000,7 +1000,7 @@
fprintf(fp_cpp, "void Bundle::initialize_nops(MachNode * nop_list[%d], Compile *C) {\n", nopcnt);
int i = 0;
for ( _pipeline->_noplist.reset(); (nop = _pipeline->_noplist.iter()) != NULL; i++ ) {
- fprintf(fp_cpp, " nop_list[%d] = (MachNode *) new (C) %sNode();\n", i, nop);
+ fprintf(fp_cpp, " nop_list[%d] = (MachNode *) new %sNode();\n", i, nop);
}
fprintf(fp_cpp, "};\n\n");
fprintf(fp_cpp, "#ifndef PRODUCT\n");
@@ -1328,7 +1328,7 @@
preplace->next_instruction(root_inst);
InstructForm *root_form = globals[root_inst]->is_instruction();
assert( root_form != NULL, "Replacement instruction was not previously defined");
- fprintf(fp, " %sNode *root = new (C) %sNode();\n", root_inst, root_inst);
+ fprintf(fp, " %sNode *root = new %sNode();\n", root_inst, root_inst);
int inst_num;
const char *op_name;
@@ -1497,11 +1497,11 @@
new_oper = frm->is_operand();
char *tmp = (char *)node->_exprule->_newopconst[new_id];
if (tmp == NULL) {
- fprintf(fp," MachOper *op%d = new (C) %sOper();\n",
+ fprintf(fp," MachOper *op%d = new %sOper();\n",
cnt, new_oper->_ident);
}
else {
- fprintf(fp," MachOper *op%d = new (C) %sOper(%s);\n",
+ fprintf(fp," MachOper *op%d = new %sOper(%s);\n",
cnt, new_oper->_ident, tmp);
}
}
@@ -1566,7 +1566,7 @@
}
// Build the node for the instruction
- fprintf(fp,"\n %sNode *n%d = new (C) %sNode();\n", new_id, cnt, new_id);
+ fprintf(fp,"\n %sNode *n%d = new %sNode();\n", new_id, cnt, new_id);
// Add control edge for this node
fprintf(fp," n%d->add_req(_in[0]);\n", cnt);
// Build the operand for the value this node defines.
@@ -1729,7 +1729,7 @@
declared_def = true;
}
if (op && op->_interface && op->_interface->is_RegInterface()) {
- fprintf(fp," def = new (C) MachTempNode(state->MachOperGenerator( %s, C ));\n",
+ fprintf(fp," def = new MachTempNode(state->MachOperGenerator( %s, C ));\n",
machOperEnum(op->_ident));
fprintf(fp," add_req(def);\n");
// The operand for TEMP is already constructed during
@@ -1760,7 +1760,7 @@
}
fprintf(fp," kill = ");
- fprintf(fp,"new (C) MachProjNode( %s, %d, (%s), Op_%s );\n",
+ fprintf(fp,"new MachProjNode( %s, %d, (%s), Op_%s );\n",
machNode, proj_no++, regmask, ideal_type);
fprintf(fp," proj_list.push(kill);\n");
}
@@ -2840,7 +2840,7 @@
// generate code to create a clone for a class derived from MachOper
//
// (0) MachOper *MachOperXOper::clone(Compile* C) const {
-// (1) return new (C) MachXOper( _ccode, _c0, _c1, ..., _cn);
+// (1) return new MachXOper( _ccode, _c0, _c1, ..., _cn);
// (2) }
//
static void defineClone(FILE *fp, FormDict &globalNames, OperandForm &oper) {
@@ -2849,7 +2849,7 @@
const int num_consts = oper.num_consts(globalNames);
const bool is_ideal_bool = oper.is_ideal_bool();
if( (num_consts > 0) ) {
- fprintf(fp," return new (C) %sOper(", oper._ident);
+ fprintf(fp," return new %sOper(", oper._ident);
// generate parameters for constants
int i = 0;
fprintf(fp,"_c%d", i);
@@ -2861,7 +2861,7 @@
}
else {
assert( num_consts == 0, "Currently support zero or one constant per operand clone function");
- fprintf(fp," return new (C) %sOper();\n", oper._ident);
+ fprintf(fp," return new %sOper();\n", oper._ident);
}
// finish method
fprintf(fp,"}\n");
@@ -3106,7 +3106,7 @@
defineIn_RegMask(_CPP_MISC_file._fp, _globalNames, *oper);
fprintf(fp,"MachOper *%sOper::clone(Compile* C) const {\n", oper->_ident);
- fprintf(fp," return new (C) %sOper(_label, _block_num);\n", oper->_ident);
+ fprintf(fp," return new %sOper(_label, _block_num);\n", oper->_ident);
fprintf(fp,"}\n");
fprintf(fp,"uint %sOper::opcode() const { return %s; }\n",
@@ -3125,7 +3125,7 @@
defineIn_RegMask(_CPP_MISC_file._fp, _globalNames, *oper);
fprintf(fp,"MachOper *%sOper::clone(Compile* C) const {\n", oper->_ident);
- fprintf(fp," return new (C) %sOper(_method);\n", oper->_ident);
+ fprintf(fp," return new %sOper(_method);\n", oper->_ident);
fprintf(fp,"}\n");
fprintf(fp,"uint %sOper::opcode() const { return %s; }\n",
@@ -3815,7 +3815,7 @@
// Generate the case statement for this opcode
fprintf(fp, " case %s:", opEnumName);
- fprintf(fp, "\n return new (C) %sOper(", opName);
+ fprintf(fp, "\n return new %sOper(", opName);
// Access parameters for constructor from the stat object
//
// Build access to condition code value
@@ -3894,7 +3894,7 @@
const char *opClass = inst->_ident;
// Create the MachNode object
- fprintf(fp_cpp, "%s %sNode *node = new (C) %sNode();\n",indent, opClass,opClass);
+ fprintf(fp_cpp, "%s %sNode *node = new %sNode();\n",indent, opClass,opClass);
if ( (inst->num_post_match_opnds() != 0) ) {
// Instruction that contains operands which are not in match rule.
@@ -3936,7 +3936,7 @@
// Check for multiple constants and then fill them in.
// Just like MachOperGenerator
const char *opName = inst->_matrule->_rChild->_opType;
- fprintf(fp_cpp, "new (C) %sOper(", opName);
+ fprintf(fp_cpp, "new %sOper(", opName);
// Grab operand form
OperandForm *op = (_globalNames[opName])->is_operand();
// Look up the number of constants
@@ -4010,7 +4010,7 @@
fprintf(fp_cpp, "// Build CISC version of this instruction\n");
fprintf(fp_cpp, "MachNode *%sNode::cisc_version( int offset, Compile* C ) {\n", this->_ident);
// Create the MachNode object
- fprintf(fp_cpp, " %sNode *node = new (C) %sNode();\n", name, name);
+ fprintf(fp_cpp, " %sNode *node = new %sNode();\n", name, name);
// Fill in the bottom_type where requested
if ( this->captures_bottom_type(AD.globalNames()) ) {
fprintf(fp_cpp, " node->_bottom_type = bottom_type();\n");
@@ -4026,7 +4026,7 @@
fprintf(fp_cpp, " fill_new_machnode(node, C);\n");
// Construct operand to access [stack_pointer + offset]
fprintf(fp_cpp, " // Construct operand to access [stack_pointer + offset]\n");
- fprintf(fp_cpp, " node->set_opnd_array(cisc_operand(), new (C) %sOper(offset));\n", cisc_oper_name);
+ fprintf(fp_cpp, " node->set_opnd_array(cisc_operand(), new %sOper(offset));\n", cisc_oper_name);
fprintf(fp_cpp, "\n");
// Return result and exit scope
@@ -4057,7 +4057,7 @@
fprintf(fp_cpp, "// Build short branch version of this instruction\n");
fprintf(fp_cpp, "MachNode *%sNode::short_branch_version(Compile* C) {\n", this->_ident);
// Create the MachNode object
- fprintf(fp_cpp, " %sNode *node = new (C) %sNode();\n", name, name);
+ fprintf(fp_cpp, " %sNode *node = new %sNode();\n", name, name);
if( is_ideal_if() ) {
fprintf(fp_cpp, " node->_prob = _prob;\n");
fprintf(fp_cpp, " node->_fcnt = _fcnt;\n");
--- a/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -2054,7 +2054,7 @@
bool will_link;
ciKlass* klass = stream()->get_klass(will_link);
assert(klass->is_instance_klass(), "must be an instance klass");
- NewInstance* new_instance = new NewInstance(klass->as_instance_klass(), state_before);
+ NewInstance* new_instance = new NewInstance(klass->as_instance_klass(), state_before, stream()->is_unresolved_klass());
_memory->new_instance(new_instance);
apush(append_split(new_instance));
}
--- a/hotspot/src/share/vm/c1/c1_Instruction.hpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/c1/c1_Instruction.hpp Wed Jul 05 19:46:31 2017 +0200
@@ -1291,16 +1291,18 @@
LEAF(NewInstance, StateSplit)
private:
ciInstanceKlass* _klass;
+ bool _is_unresolved;
public:
// creation
- NewInstance(ciInstanceKlass* klass, ValueStack* state_before)
+ NewInstance(ciInstanceKlass* klass, ValueStack* state_before, bool is_unresolved)
: StateSplit(instanceType, state_before)
- , _klass(klass)
+ , _klass(klass), _is_unresolved(is_unresolved)
{}
// accessors
ciInstanceKlass* klass() const { return _klass; }
+ bool is_unresolved() const { return _is_unresolved; }
virtual bool needs_exception_state() const { return false; }
--- a/hotspot/src/share/vm/c1/c1_LIRAssembler.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/c1/c1_LIRAssembler.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -336,7 +336,6 @@
void LIR_Assembler::add_debug_info_for_branch(CodeEmitInfo* info) {
- _masm->code_section()->relocate(pc(), relocInfo::poll_type);
int pc_offset = code_offset();
flush_debug_info(pc_offset);
info->record_debug_info(compilation()->debug_info_recorder(), pc_offset);
--- a/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -466,8 +466,11 @@
}
-void LIRGenerator::klass2reg_with_patching(LIR_Opr r, ciMetadata* obj, CodeEmitInfo* info) {
- if (!obj->is_loaded() || PatchALot) {
+void LIRGenerator::klass2reg_with_patching(LIR_Opr r, ciMetadata* obj, CodeEmitInfo* info, bool need_resolve) {
+ /* C2 relies on constant pool entries being resolved (ciTypeFlow), so if TieredCompilation
+ * is active and the class hasn't yet been resolved we need to emit a patch that resolves
+ * the class. */
+ if ((TieredCompilation && need_resolve) || !obj->is_loaded() || PatchALot) {
assert(info != NULL, "info must be set if class is not loaded");
__ klass2reg_patch(NULL, r, info);
} else {
@@ -660,9 +663,18 @@
__ unlock_object(hdr, object, lock, scratch, slow_path);
}
-
-void LIRGenerator::new_instance(LIR_Opr dst, ciInstanceKlass* klass, LIR_Opr scratch1, LIR_Opr scratch2, LIR_Opr scratch3, LIR_Opr scratch4, LIR_Opr klass_reg, CodeEmitInfo* info) {
- klass2reg_with_patching(klass_reg, klass, info);
+#ifndef PRODUCT
+void LIRGenerator::print_if_not_loaded(const NewInstance* new_instance) {
+ if (PrintNotLoaded && !new_instance->klass()->is_loaded()) {
+ tty->print_cr(" ###class not loaded at new bci %d", new_instance->printable_bci());
+ } else if (PrintNotLoaded && (TieredCompilation && new_instance->is_unresolved())) {
+ tty->print_cr(" ###class not resolved at new bci %d", new_instance->printable_bci());
+ }
+}
+#endif
+
+void LIRGenerator::new_instance(LIR_Opr dst, ciInstanceKlass* klass, bool is_unresolved, LIR_Opr scratch1, LIR_Opr scratch2, LIR_Opr scratch3, LIR_Opr scratch4, LIR_Opr klass_reg, CodeEmitInfo* info) {
+ klass2reg_with_patching(klass_reg, klass, info, is_unresolved);
// If klass is not loaded we do not know if the klass has finalizers:
if (UseFastNewInstance && klass->is_loaded()
&& !Klass::layout_helper_needs_slow_path(klass->layout_helper())) {
--- a/hotspot/src/share/vm/c1/c1_LIRGenerator.hpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/c1/c1_LIRGenerator.hpp Wed Jul 05 19:46:31 2017 +0200
@@ -169,6 +169,8 @@
return this;
}
+ void print_if_not_loaded(const NewInstance* new_instance) PRODUCT_RETURN;
+
#ifdef ASSERT
LIR_List* lir(const char * file, int line) const {
_lir->set_file_and_line(file, line);
@@ -307,7 +309,7 @@
void store_stack_parameter (LIR_Opr opr, ByteSize offset_from_sp_in_bytes);
- void klass2reg_with_patching(LIR_Opr r, ciMetadata* obj, CodeEmitInfo* info);
+ void klass2reg_with_patching(LIR_Opr r, ciMetadata* obj, CodeEmitInfo* info, bool need_resolve = false);
// this loads the length and compares against the index
void array_range_check (LIR_Opr array, LIR_Opr index, CodeEmitInfo* null_check_info, CodeEmitInfo* range_check_info);
@@ -325,7 +327,7 @@
void monitor_enter (LIR_Opr object, LIR_Opr lock, LIR_Opr hdr, LIR_Opr scratch, int monitor_no, CodeEmitInfo* info_for_exception, CodeEmitInfo* info);
void monitor_exit (LIR_Opr object, LIR_Opr lock, LIR_Opr hdr, LIR_Opr scratch, int monitor_no);
- void new_instance (LIR_Opr dst, ciInstanceKlass* klass, LIR_Opr scratch1, LIR_Opr scratch2, LIR_Opr scratch3, LIR_Opr scratch4, LIR_Opr klass_reg, CodeEmitInfo* info);
+ void new_instance (LIR_Opr dst, ciInstanceKlass* klass, bool is_unresolved, LIR_Opr scratch1, LIR_Opr scratch2, LIR_Opr scratch3, LIR_Opr scratch4, LIR_Opr klass_reg, CodeEmitInfo* info);
// machine dependent
void cmp_mem_int(LIR_Condition condition, LIR_Opr base, int disp, int c, CodeEmitInfo* info);
--- a/hotspot/src/share/vm/c1/c1_Runtime1.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/c1/c1_Runtime1.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -123,24 +123,24 @@
int Runtime1::_throw_array_store_exception_count = 0;
int Runtime1::_throw_count = 0;
-static int _byte_arraycopy_cnt = 0;
-static int _short_arraycopy_cnt = 0;
-static int _int_arraycopy_cnt = 0;
-static int _long_arraycopy_cnt = 0;
-static int _oop_arraycopy_cnt = 0;
+static int _byte_arraycopy_stub_cnt = 0;
+static int _short_arraycopy_stub_cnt = 0;
+static int _int_arraycopy_stub_cnt = 0;
+static int _long_arraycopy_stub_cnt = 0;
+static int _oop_arraycopy_stub_cnt = 0;
address Runtime1::arraycopy_count_address(BasicType type) {
switch (type) {
case T_BOOLEAN:
- case T_BYTE: return (address)&_byte_arraycopy_cnt;
+ case T_BYTE: return (address)&_byte_arraycopy_stub_cnt;
case T_CHAR:
- case T_SHORT: return (address)&_short_arraycopy_cnt;
+ case T_SHORT: return (address)&_short_arraycopy_stub_cnt;
case T_FLOAT:
- case T_INT: return (address)&_int_arraycopy_cnt;
+ case T_INT: return (address)&_int_arraycopy_stub_cnt;
case T_DOUBLE:
- case T_LONG: return (address)&_long_arraycopy_cnt;
+ case T_LONG: return (address)&_long_arraycopy_stub_cnt;
case T_ARRAY:
- case T_OBJECT: return (address)&_oop_arraycopy_cnt;
+ case T_OBJECT: return (address)&_oop_arraycopy_stub_cnt;
default:
ShouldNotReachHere();
return NULL;
@@ -1479,13 +1479,13 @@
tty->print_cr(" _ic_miss_cnt: %d", SharedRuntime::_ic_miss_ctr);
tty->print_cr(" _generic_arraycopy_cnt: %d", _generic_arraycopy_cnt);
tty->print_cr(" _generic_arraycopystub_cnt: %d", _generic_arraycopystub_cnt);
- tty->print_cr(" _byte_arraycopy_cnt: %d", _byte_arraycopy_cnt);
- tty->print_cr(" _short_arraycopy_cnt: %d", _short_arraycopy_cnt);
- tty->print_cr(" _int_arraycopy_cnt: %d", _int_arraycopy_cnt);
- tty->print_cr(" _long_arraycopy_cnt: %d", _long_arraycopy_cnt);
+ tty->print_cr(" _byte_arraycopy_cnt: %d", _byte_arraycopy_stub_cnt);
+ tty->print_cr(" _short_arraycopy_cnt: %d", _short_arraycopy_stub_cnt);
+ tty->print_cr(" _int_arraycopy_cnt: %d", _int_arraycopy_stub_cnt);
+ tty->print_cr(" _long_arraycopy_cnt: %d", _long_arraycopy_stub_cnt);
tty->print_cr(" _primitive_arraycopy_cnt: %d", _primitive_arraycopy_cnt);
tty->print_cr(" _oop_arraycopy_cnt (C): %d", Runtime1::_oop_arraycopy_cnt);
- tty->print_cr(" _oop_arraycopy_cnt (stub): %d", _oop_arraycopy_cnt);
+ tty->print_cr(" _oop_arraycopy_cnt (stub): %d", _oop_arraycopy_stub_cnt);
tty->print_cr(" _arraycopy_slowcase_cnt: %d", _arraycopy_slowcase_cnt);
tty->print_cr(" _arraycopy_checkcast_cnt: %d", _arraycopy_checkcast_cnt);
tty->print_cr(" _arraycopy_checkcast_attempt_cnt:%d", _arraycopy_checkcast_attempt_cnt);
--- a/hotspot/src/share/vm/classfile/vmSymbols.hpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/classfile/vmSymbols.hpp Wed Jul 05 19:46:31 2017 +0200
@@ -790,6 +790,26 @@
do_name( decrypt_name, "decrypt") \
do_signature(byteArray_int_int_byteArray_int_signature, "([BII[BI)I") \
\
+ /* support for sun.security.provider.SHA */ \
+ do_class(sun_security_provider_sha, "sun/security/provider/SHA") \
+ do_intrinsic(_sha_implCompress, sun_security_provider_sha, implCompress_name, implCompress_signature, F_R) \
+ do_name( implCompress_name, "implCompress") \
+ do_signature(implCompress_signature, "([BI)V") \
+ \
+ /* support for sun.security.provider.SHA2 */ \
+ do_class(sun_security_provider_sha2, "sun/security/provider/SHA2") \
+ do_intrinsic(_sha2_implCompress, sun_security_provider_sha2, implCompress_name, implCompress_signature, F_R) \
+ \
+ /* support for sun.security.provider.SHA5 */ \
+ do_class(sun_security_provider_sha5, "sun/security/provider/SHA5") \
+ do_intrinsic(_sha5_implCompress, sun_security_provider_sha5, implCompress_name, implCompress_signature, F_R) \
+ \
+ /* support for sun.security.provider.DigestBase */ \
+ do_class(sun_security_provider_digestbase, "sun/security/provider/DigestBase") \
+ do_intrinsic(_digestBase_implCompressMB, sun_security_provider_digestbase, implCompressMB_name, implCompressMB_signature, F_R) \
+ do_name( implCompressMB_name, "implCompressMultiBlock") \
+ do_signature(implCompressMB_signature, "([BII)I") \
+ \
/* support for java.util.zip */ \
do_class(java_util_zip_CRC32, "java/util/zip/CRC32") \
do_intrinsic(_updateCRC32, java_util_zip_CRC32, update_name, int2_int_signature, F_SN) \
--- a/hotspot/src/share/vm/code/relocInfo.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/code/relocInfo.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -877,11 +877,7 @@
void internal_word_Relocation::fix_relocation_after_move(const CodeBuffer* src, CodeBuffer* dest) {
address target = _target;
if (target == NULL) {
- if (addr_in_const()) {
- target = new_addr_for(*(address*)addr(), src, dest);
- } else {
- target = new_addr_for(pd_get_address_from_code(), src, dest);
- }
+ target = new_addr_for(this->target(), src, dest);
}
set_value(target);
}
@@ -890,7 +886,11 @@
address internal_word_Relocation::target() {
address target = _target;
if (target == NULL) {
- target = pd_get_address_from_code();
+ if (addr_in_const()) {
+ target = *(address*)addr();
+ } else {
+ target = pd_get_address_from_code();
+ }
}
return target;
}
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsAdaptiveSizePolicy.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsAdaptiveSizePolicy.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -1341,13 +1341,14 @@
bool CMSAdaptiveSizePolicy::print_adaptive_size_policy_on(
outputStream* st) const {
- if (!UseAdaptiveSizePolicy) return false;
+ if (!UseAdaptiveSizePolicy) {
+ return false;
+ }
GenCollectedHeap* gch = GenCollectedHeap::heap();
- Generation* gen0 = gch->get_gen(0);
- DefNewGeneration* def_new = gen0->as_DefNewGeneration();
- return
- AdaptiveSizePolicy::print_adaptive_size_policy_on(
+ Generation* young = gch->get_gen(0);
+ DefNewGeneration* def_new = young->as_DefNewGeneration();
+ return AdaptiveSizePolicy::print_adaptive_size_policy_on(
st,
def_new->tenuring_threshold());
}
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsCollectorPolicy.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsCollectorPolicy.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -60,21 +60,21 @@
if (UseParNewGC) {
if (UseAdaptiveSizePolicy) {
_generations[0] = new GenerationSpec(Generation::ASParNew,
- _initial_gen0_size, _max_gen0_size);
+ _initial_young_size, _max_young_size);
} else {
_generations[0] = new GenerationSpec(Generation::ParNew,
- _initial_gen0_size, _max_gen0_size);
+ _initial_young_size, _max_young_size);
}
} else {
_generations[0] = new GenerationSpec(Generation::DefNew,
- _initial_gen0_size, _max_gen0_size);
+ _initial_young_size, _max_young_size);
}
if (UseAdaptiveSizePolicy) {
_generations[1] = new GenerationSpec(Generation::ASConcurrentMarkSweep,
- _initial_gen1_size, _max_gen1_size);
+ _initial_old_size, _max_old_size);
} else {
_generations[1] = new GenerationSpec(Generation::ConcurrentMarkSweep,
- _initial_gen1_size, _max_gen1_size);
+ _initial_old_size, _max_old_size);
}
if (_generations[0] == NULL || _generations[1] == NULL) {
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -1138,8 +1138,8 @@
void CMSCollector::icms_update_allocation_limits()
{
- Generation* gen0 = GenCollectedHeap::heap()->get_gen(0);
- EdenSpace* eden = gen0->as_DefNewGeneration()->eden();
+ Generation* young = GenCollectedHeap::heap()->get_gen(0);
+ EdenSpace* eden = young->as_DefNewGeneration()->eden();
const unsigned int duty_cycle = stats().icms_update_duty_cycle();
if (CMSTraceIncrementalPacing) {
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp Wed Jul 05 19:46:31 2017 +0200
@@ -1193,10 +1193,9 @@
// Does a "full" (forced) collection invoked on this generation collect
// all younger generations as well? Note that the second conjunct is a
// hack to allow the collection of the younger gen first if the flag is
- // set. This is better than using th policy's should_collect_gen0_first()
- // since that causes us to do an extra unnecessary pair of restart-&-stop-world.
+ // set.
virtual bool full_collects_younger_generations() const {
- return UseCMSCompactAtFullCollection && !CollectGen0First;
+ return UseCMSCompactAtFullCollection && !ScavengeBeforeFullGC;
}
void space_iterate(SpaceClosure* blk, bool usedOnly = false);
--- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -3622,7 +3622,7 @@
void G1CollectedHeap::print_tracing_info() const {
// We'll overload this to mean "trace GC pause statistics."
- if (TraceGen0Time || TraceGen1Time) {
+ if (TraceYoungGenTime || TraceOldGenTime) {
// The "G1CollectorPolicy" is keeping track of these stats, so delegate
// to that.
g1_policy()->print_tracing_info();
--- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -809,7 +809,7 @@
double full_gc_time_sec = end_sec - _full_collection_start_sec;
double full_gc_time_ms = full_gc_time_sec * 1000.0;
- _trace_gen1_time_data.record_full_collection(full_gc_time_ms);
+ _trace_old_gen_time_data.record_full_collection(full_gc_time_ms);
update_recent_gc_times(end_sec, full_gc_time_ms);
@@ -851,7 +851,7 @@
_g1->used(), _g1->recalculate_used()));
double s_w_t_ms = (start_time_sec - _stop_world_start) * 1000.0;
- _trace_gen0_time_data.record_start_collection(s_w_t_ms);
+ _trace_young_gen_time_data.record_start_collection(s_w_t_ms);
_stop_world_start = 0.0;
record_heap_size_info_at_start(false /* full */);
@@ -906,7 +906,7 @@
void G1CollectorPolicy::record_concurrent_pause() {
if (_stop_world_start > 0.0) {
double yield_ms = (os::elapsedTime() - _stop_world_start) * 1000.0;
- _trace_gen0_time_data.record_yield_time(yield_ms);
+ _trace_young_gen_time_data.record_yield_time(yield_ms);
}
}
@@ -993,7 +993,7 @@
evacuation_info.set_bytes_copied(_bytes_copied_during_gc);
if (update_stats) {
- _trace_gen0_time_data.record_end_collection(pause_time_ms, phase_times());
+ _trace_young_gen_time_data.record_end_collection(pause_time_ms, phase_times());
// this is where we update the allocation rate of the application
double app_time_ms =
(phase_times()->cur_collection_start_sec() * 1000.0 - _prev_collection_pause_end_ms);
@@ -1415,8 +1415,8 @@
}
void G1CollectorPolicy::print_tracing_info() const {
- _trace_gen0_time_data.print();
- _trace_gen1_time_data.print();
+ _trace_young_gen_time_data.print();
+ _trace_old_gen_time_data.print();
}
void G1CollectorPolicy::print_yg_surv_rate_info() const {
@@ -1973,9 +1973,9 @@
_last_gc_was_young = gcs_are_young() ? true : false;
if (_last_gc_was_young) {
- _trace_gen0_time_data.increment_young_collection_count();
+ _trace_young_gen_time_data.increment_young_collection_count();
} else {
- _trace_gen0_time_data.increment_mixed_collection_count();
+ _trace_young_gen_time_data.increment_mixed_collection_count();
}
// The young list is laid with the survivor regions from the previous
@@ -2156,20 +2156,20 @@
evacuation_info.set_collectionset_regions(cset_region_length());
}
-void TraceGen0TimeData::record_start_collection(double time_to_stop_the_world_ms) {
- if(TraceGen0Time) {
+void TraceYoungGenTimeData::record_start_collection(double time_to_stop_the_world_ms) {
+ if(TraceYoungGenTime) {
_all_stop_world_times_ms.add(time_to_stop_the_world_ms);
}
}
-void TraceGen0TimeData::record_yield_time(double yield_time_ms) {
- if(TraceGen0Time) {
+void TraceYoungGenTimeData::record_yield_time(double yield_time_ms) {
+ if(TraceYoungGenTime) {
_all_yield_times_ms.add(yield_time_ms);
}
}
-void TraceGen0TimeData::record_end_collection(double pause_time_ms, G1GCPhaseTimes* phase_times) {
- if(TraceGen0Time) {
+void TraceYoungGenTimeData::record_end_collection(double pause_time_ms, G1GCPhaseTimes* phase_times) {
+ if(TraceYoungGenTime) {
_total.add(pause_time_ms);
_other.add(pause_time_ms - phase_times->accounted_time_ms());
_root_region_scan_wait.add(phase_times->root_region_scan_wait_time_ms());
@@ -2194,34 +2194,34 @@
}
}
-void TraceGen0TimeData::increment_young_collection_count() {
- if(TraceGen0Time) {
+void TraceYoungGenTimeData::increment_young_collection_count() {
+ if(TraceYoungGenTime) {
++_young_pause_num;
}
}
-void TraceGen0TimeData::increment_mixed_collection_count() {
- if(TraceGen0Time) {
+void TraceYoungGenTimeData::increment_mixed_collection_count() {
+ if(TraceYoungGenTime) {
++_mixed_pause_num;
}
}
-void TraceGen0TimeData::print_summary(const char* str,
- const NumberSeq* seq) const {
+void TraceYoungGenTimeData::print_summary(const char* str,
+ const NumberSeq* seq) const {
double sum = seq->sum();
gclog_or_tty->print_cr("%-27s = %8.2lf s (avg = %8.2lf ms)",
str, sum / 1000.0, seq->avg());
}
-void TraceGen0TimeData::print_summary_sd(const char* str,
- const NumberSeq* seq) const {
+void TraceYoungGenTimeData::print_summary_sd(const char* str,
+ const NumberSeq* seq) const {
print_summary(str, seq);
gclog_or_tty->print_cr("%+45s = %5d, std dev = %8.2lf ms, max = %8.2lf ms)",
"(num", seq->num(), seq->sd(), seq->maximum());
}
-void TraceGen0TimeData::print() const {
- if (!TraceGen0Time) {
+void TraceYoungGenTimeData::print() const {
+ if (!TraceYoungGenTime) {
return;
}
@@ -2258,14 +2258,14 @@
print_summary_sd(" Yields", &_all_yield_times_ms);
}
-void TraceGen1TimeData::record_full_collection(double full_gc_time_ms) {
- if (TraceGen1Time) {
+void TraceOldGenTimeData::record_full_collection(double full_gc_time_ms) {
+ if (TraceOldGenTime) {
_all_full_gc_times.add(full_gc_time_ms);
}
}
-void TraceGen1TimeData::print() const {
- if (!TraceGen1Time) {
+void TraceOldGenTimeData::print() const {
+ if (!TraceOldGenTime) {
return;
}
--- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp Wed Jul 05 19:46:31 2017 +0200
@@ -38,10 +38,10 @@
class CollectionSetChooser;
class G1GCPhaseTimes;
-// TraceGen0Time collects data on _both_ young and mixed evacuation pauses
+// TraceYoungGenTime collects data on _both_ young and mixed evacuation pauses
// (the latter may contain non-young regions - i.e. regions that are
-// technically in Gen1) while TraceGen1Time collects data about full GCs.
-class TraceGen0TimeData : public CHeapObj<mtGC> {
+// technically in old) while TraceOldGenTime collects data about full GCs.
+class TraceYoungGenTimeData : public CHeapObj<mtGC> {
private:
unsigned _young_pause_num;
unsigned _mixed_pause_num;
@@ -66,7 +66,7 @@
void print_summary_sd(const char* str, const NumberSeq* seq) const;
public:
- TraceGen0TimeData() : _young_pause_num(0), _mixed_pause_num(0) {};
+ TraceYoungGenTimeData() : _young_pause_num(0), _mixed_pause_num(0) {};
void record_start_collection(double time_to_stop_the_world_ms);
void record_yield_time(double yield_time_ms);
void record_end_collection(double pause_time_ms, G1GCPhaseTimes* phase_times);
@@ -75,7 +75,7 @@
void print() const;
};
-class TraceGen1TimeData : public CHeapObj<mtGC> {
+class TraceOldGenTimeData : public CHeapObj<mtGC> {
private:
NumberSeq _all_full_gc_times;
@@ -187,8 +187,8 @@
TruncatedSeq* _concurrent_mark_remark_times_ms;
TruncatedSeq* _concurrent_mark_cleanup_times_ms;
- TraceGen0TimeData _trace_gen0_time_data;
- TraceGen1TimeData _trace_gen1_time_data;
+ TraceYoungGenTimeData _trace_young_gen_time_data;
+ TraceOldGenTimeData _trace_old_gen_time_data;
double _stop_world_start;
@@ -202,20 +202,20 @@
// locker is active. This should be >= _young_list_target_length;
uint _young_list_max_length;
- bool _last_gc_was_young;
+ bool _last_gc_was_young;
- bool _during_marking;
- bool _in_marking_window;
- bool _in_marking_window_im;
+ bool _during_marking;
+ bool _in_marking_window;
+ bool _in_marking_window_im;
- SurvRateGroup* _short_lived_surv_rate_group;
- SurvRateGroup* _survivor_surv_rate_group;
+ SurvRateGroup* _short_lived_surv_rate_group;
+ SurvRateGroup* _survivor_surv_rate_group;
// add here any more surv rate groups
- double _gc_overhead_perc;
+ double _gc_overhead_perc;
double _reserve_factor;
- uint _reserve_regions;
+ uint _reserve_regions;
bool during_marking() {
return _during_marking;
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/adjoiningGenerations.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/adjoiningGenerations.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -35,14 +35,14 @@
AdjoiningGenerations::AdjoiningGenerations(ReservedSpace old_young_rs,
GenerationSizer* policy,
size_t alignment) :
- _virtual_spaces(old_young_rs, policy->min_gen1_size(),
- policy->min_gen0_size(), alignment) {
- size_t init_low_byte_size = policy->initial_gen1_size();
- size_t min_low_byte_size = policy->min_gen1_size();
- size_t max_low_byte_size = policy->max_gen1_size();
- size_t init_high_byte_size = policy->initial_gen0_size();
- size_t min_high_byte_size = policy->min_gen0_size();
- size_t max_high_byte_size = policy->max_gen0_size();
+ _virtual_spaces(old_young_rs, policy->min_old_size(),
+ policy->min_young_size(), alignment) {
+ size_t init_low_byte_size = policy->initial_old_size();
+ size_t min_low_byte_size = policy->min_old_size();
+ size_t max_low_byte_size = policy->max_old_size();
+ size_t init_high_byte_size = policy->initial_young_size();
+ size_t min_high_byte_size = policy->min_young_size();
+ size_t max_high_byte_size = policy->max_young_size();
assert(min_low_byte_size <= init_low_byte_size &&
init_low_byte_size <= max_low_byte_size, "Parameter check");
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/generationSizer.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/generationSizer.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -32,8 +32,8 @@
SIZE_FORMAT "," SIZE_FORMAT " "
SIZE_FORMAT,
str,
- _min_gen1_size / K, _max_gen1_size / K,
- _min_gen0_size / K, _max_gen0_size / K,
+ _min_old_size / K, _max_old_size / K,
+ _min_young_size / K, _max_young_size / K,
_max_heap_byte_size / K);
}
}
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -623,11 +623,11 @@
}
void ParallelScavengeHeap::print_tracing_info() const {
- if (TraceGen0Time) {
+ if (TraceYoungGenTime) {
double time = PSScavenge::accumulated_time()->seconds();
tty->print_cr("[Accumulated GC generation 0 time %3.7f secs]", time);
}
- if (TraceGen1Time) {
+ if (TraceOldGenTime) {
double time = UseParallelOldGC ? PSParallelCompact::accumulated_time()->seconds() : PSMarkSweep::accumulated_time()->seconds();
tty->print_cr("[Accumulated GC generation 1 time %3.7f secs]", time);
}
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -174,7 +174,7 @@
TraceCollectorStats tcs(counters());
TraceMemoryManagerStats tms(true /* Full GC */,gc_cause);
- if (TraceGen1Time) accumulated_time()->start();
+ if (TraceOldGenTime) accumulated_time()->start();
// Let the size policy know we're starting
size_policy->major_collection_begin();
@@ -354,7 +354,7 @@
// We collected the heap, recalculate the metaspace capacity
MetaspaceGC::compute_new_size();
- if (TraceGen1Time) accumulated_time()->stop();
+ if (TraceOldGenTime) accumulated_time()->stop();
if (PrintGC) {
if (PrintGCDetails) {
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -2061,7 +2061,7 @@
TraceCollectorStats tcs(counters());
TraceMemoryManagerStats tms(true /* Full GC */,gc_cause);
- if (TraceGen1Time) accumulated_time()->start();
+ if (TraceOldGenTime) accumulated_time()->start();
// Let the size policy know we're starting
size_policy->major_collection_begin();
@@ -2188,7 +2188,7 @@
// Resize the metaspace capacity after a collection
MetaspaceGC::compute_new_size();
- if (TraceGen1Time) accumulated_time()->stop();
+ if (TraceOldGenTime) accumulated_time()->stop();
if (PrintGC) {
if (PrintGCDetails) {
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -336,7 +336,7 @@
TraceCollectorStats tcs(counters());
TraceMemoryManagerStats tms(false /* not full GC */,gc_cause);
- if (TraceGen0Time) accumulated_time()->start();
+ if (TraceYoungGenTime) accumulated_time()->start();
// Let the size policy know we're starting
size_policy->minor_collection_begin();
@@ -660,7 +660,7 @@
CardTableExtension::verify_all_young_refs_imprecise();
}
- if (TraceGen0Time) accumulated_time()->stop();
+ if (TraceYoungGenTime) accumulated_time()->stop();
if (PrintGC) {
if (PrintGCDetails) {
--- a/hotspot/src/share/vm/memory/collectorPolicy.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/memory/collectorPolicy.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -196,13 +196,13 @@
// GenCollectorPolicy methods
GenCollectorPolicy::GenCollectorPolicy() :
- _min_gen0_size(0),
- _initial_gen0_size(0),
- _max_gen0_size(0),
+ _min_young_size(0),
+ _initial_young_size(0),
+ _max_young_size(0),
_gen_alignment(0),
- _min_gen1_size(0),
- _initial_gen1_size(0),
- _max_gen1_size(0),
+ _min_old_size(0),
+ _initial_old_size(0),
+ _max_old_size(0),
_generations(NULL)
{}
@@ -236,7 +236,7 @@
#ifdef ASSERT
void GenCollectorPolicy::assert_flags() {
CollectorPolicy::assert_flags();
- assert(NewSize >= _min_gen0_size, "Ergonomics decided on a too small young gen size");
+ assert(NewSize >= _min_young_size, "Ergonomics decided on a too small young gen size");
assert(NewSize <= MaxNewSize, "Ergonomics decided on incompatible initial and maximum young gen sizes");
assert(FLAG_IS_DEFAULT(MaxNewSize) || MaxNewSize < MaxHeapSize, "Ergonomics decided on incompatible maximum young gen and heap sizes");
assert(NewSize % _gen_alignment == 0, "NewSize alignment");
@@ -249,28 +249,28 @@
CollectorPolicy::assert_size_info();
// GenCollectorPolicy::initialize_size_info may update the MaxNewSize
assert(MaxNewSize < MaxHeapSize, "Ergonomics decided on incompatible maximum young and heap sizes");
- assert(NewSize == _initial_gen0_size, "Discrepancy between NewSize flag and local storage");
- assert(MaxNewSize == _max_gen0_size, "Discrepancy between MaxNewSize flag and local storage");
- assert(OldSize == _initial_gen1_size, "Discrepancy between OldSize flag and local storage");
- assert(_min_gen0_size <= _initial_gen0_size, "Ergonomics decided on incompatible minimum and initial young gen sizes");
- assert(_initial_gen0_size <= _max_gen0_size, "Ergonomics decided on incompatible initial and maximum young gen sizes");
- assert(_min_gen0_size % _gen_alignment == 0, "_min_gen0_size alignment");
- assert(_initial_gen0_size % _gen_alignment == 0, "_initial_gen0_size alignment");
- assert(_max_gen0_size % _gen_alignment == 0, "_max_gen0_size alignment");
- assert(_min_gen0_size <= bound_minus_alignment(_min_gen0_size, _min_heap_byte_size),
+ assert(NewSize == _initial_young_size, "Discrepancy between NewSize flag and local storage");
+ assert(MaxNewSize == _max_young_size, "Discrepancy between MaxNewSize flag and local storage");
+ assert(OldSize == _initial_old_size, "Discrepancy between OldSize flag and local storage");
+ assert(_min_young_size <= _initial_young_size, "Ergonomics decided on incompatible minimum and initial young gen sizes");
+ assert(_initial_young_size <= _max_young_size, "Ergonomics decided on incompatible initial and maximum young gen sizes");
+ assert(_min_young_size % _gen_alignment == 0, "_min_young_size alignment");
+ assert(_initial_young_size % _gen_alignment == 0, "_initial_young_size alignment");
+ assert(_max_young_size % _gen_alignment == 0, "_max_young_size alignment");
+ assert(_min_young_size <= bound_minus_alignment(_min_young_size, _min_heap_byte_size),
"Ergonomics made minimum young generation larger than minimum heap");
- assert(_initial_gen0_size <= bound_minus_alignment(_initial_gen0_size, _initial_heap_byte_size),
+ assert(_initial_young_size <= bound_minus_alignment(_initial_young_size, _initial_heap_byte_size),
"Ergonomics made initial young generation larger than initial heap");
- assert(_max_gen0_size <= bound_minus_alignment(_max_gen0_size, _max_heap_byte_size),
+ assert(_max_young_size <= bound_minus_alignment(_max_young_size, _max_heap_byte_size),
"Ergonomics made maximum young generation lager than maximum heap");
- assert(_min_gen1_size <= _initial_gen1_size, "Ergonomics decided on incompatible minimum and initial old gen sizes");
- assert(_initial_gen1_size <= _max_gen1_size, "Ergonomics decided on incompatible initial and maximum old gen sizes");
- assert(_max_gen1_size % _gen_alignment == 0, "_max_gen1_size alignment");
- assert(_initial_gen1_size % _gen_alignment == 0, "_initial_gen1_size alignment");
- assert(_max_heap_byte_size <= (_max_gen0_size + _max_gen1_size), "Total maximum heap sizes must be sum of generation maximum sizes");
- assert(_min_gen0_size + _min_gen1_size <= _min_heap_byte_size, "Minimum generation sizes exceed minimum heap size");
- assert(_initial_gen0_size + _initial_gen1_size == _initial_heap_byte_size, "Initial generation sizes should match initial heap size");
- assert(_max_gen0_size + _max_gen1_size == _max_heap_byte_size, "Maximum generation sizes should match maximum heap size");
+ assert(_min_old_size <= _initial_old_size, "Ergonomics decided on incompatible minimum and initial old gen sizes");
+ assert(_initial_old_size <= _max_old_size, "Ergonomics decided on incompatible initial and maximum old gen sizes");
+ assert(_max_old_size % _gen_alignment == 0, "_max_old_size alignment");
+ assert(_initial_old_size % _gen_alignment == 0, "_initial_old_size alignment");
+ assert(_max_heap_byte_size <= (_max_young_size + _max_old_size), "Total maximum heap sizes must be sum of generation maximum sizes");
+ assert(_min_young_size + _min_old_size <= _min_heap_byte_size, "Minimum generation sizes exceed minimum heap size");
+ assert(_initial_young_size + _initial_old_size == _initial_heap_byte_size, "Initial generation sizes should match initial heap size");
+ assert(_max_young_size + _max_old_size == _max_heap_byte_size, "Maximum generation sizes should match maximum heap size");
}
#endif // ASSERT
@@ -323,8 +323,8 @@
// later when setting the initial and minimum young generation size.
NewSize = bounded_new_size;
}
- _min_gen0_size = smallest_new_size;
- _initial_gen0_size = NewSize;
+ _min_young_size = smallest_new_size;
+ _initial_young_size = NewSize;
if (!FLAG_IS_DEFAULT(MaxNewSize)) {
if (MaxNewSize >= MaxHeapSize) {
@@ -338,14 +338,14 @@
FLAG_SET_ERGO(uintx, MaxNewSize, smaller_max_new_size);
if (NewSize > MaxNewSize) {
FLAG_SET_ERGO(uintx, NewSize, MaxNewSize);
- _initial_gen0_size = NewSize;
+ _initial_young_size = NewSize;
}
- } else if (MaxNewSize < _initial_gen0_size) {
- FLAG_SET_ERGO(uintx, MaxNewSize, _initial_gen0_size);
+ } else if (MaxNewSize < _initial_young_size) {
+ FLAG_SET_ERGO(uintx, MaxNewSize, _initial_young_size);
} else if (!is_size_aligned(MaxNewSize, _gen_alignment)) {
FLAG_SET_ERGO(uintx, MaxNewSize, align_size_down(MaxNewSize, _gen_alignment));
}
- _max_gen0_size = MaxNewSize;
+ _max_young_size = MaxNewSize;
}
if (NewSize > MaxNewSize) {
@@ -357,7 +357,7 @@
NewSize/K, MaxNewSize/K, NewSize/K);
}
FLAG_SET_ERGO(uintx, MaxNewSize, NewSize);
- _max_gen0_size = MaxNewSize;
+ _max_young_size = MaxNewSize;
}
if (SurvivorRatio < 1 || NewRatio < 1) {
@@ -393,7 +393,7 @@
double shrink_factor = (double) MaxHeapSize / calculated_size;
uintx smaller_new_size = align_size_down((uintx)(NewSize * shrink_factor), _gen_alignment);
FLAG_SET_ERGO(uintx, NewSize, MAX2(young_gen_size_lower_bound(), smaller_new_size));
- _initial_gen0_size = NewSize;
+ _initial_young_size = NewSize;
// OldSize is already aligned because above we aligned MaxHeapSize to
// _heap_alignment, and we just made sure that NewSize is aligned to
@@ -406,16 +406,16 @@
}
}
- // Update NewSize, if possible, to avoid sizing gen0 to small when only
+ // Update NewSize, if possible, to avoid sizing the young gen too small when only
// OldSize is set on the command line.
if (FLAG_IS_CMDLINE(OldSize) && !FLAG_IS_CMDLINE(NewSize)) {
if (OldSize < _initial_heap_byte_size) {
size_t new_size = _initial_heap_byte_size - OldSize;
- // Need to compare against the flag value for max since _max_gen0_size
+ // Need to compare against the flag value for max since _max_young_size
// might not have been set yet.
- if (new_size >= _min_gen0_size && new_size <= MaxNewSize) {
+ if (new_size >= _min_young_size && new_size <= MaxNewSize) {
FLAG_SET_ERGO(uintx, NewSize, new_size);
- _initial_gen0_size = NewSize;
+ _initial_young_size = NewSize;
}
}
}
@@ -444,97 +444,77 @@
void GenCollectorPolicy::initialize_size_info() {
CollectorPolicy::initialize_size_info();
- // _space_alignment is used for alignment within a generation.
- // There is additional alignment done down stream for some
- // collectors that sometimes causes unwanted rounding up of
- // generations sizes.
+ _initial_young_size = NewSize;
+ _max_young_size = MaxNewSize;
+ _initial_old_size = OldSize;
- // Determine maximum size of gen0
+ // Determine maximum size of the young generation.
- size_t max_new_size = 0;
- if (!FLAG_IS_DEFAULT(MaxNewSize)) {
- max_new_size = MaxNewSize;
- } else {
- max_new_size = scale_by_NewRatio_aligned(_max_heap_byte_size);
+ if (FLAG_IS_DEFAULT(MaxNewSize)) {
+ _max_young_size = scale_by_NewRatio_aligned(_max_heap_byte_size);
// Bound the maximum size by NewSize below (since it historically
// would have been NewSize and because the NewRatio calculation could
// yield a size that is too small) and bound it by MaxNewSize above.
// Ergonomics plays here by previously calculating the desired
// NewSize and MaxNewSize.
- max_new_size = MIN2(MAX2(max_new_size, NewSize), MaxNewSize);
+ _max_young_size = MIN2(MAX2(_max_young_size, _initial_young_size), MaxNewSize);
}
- assert(max_new_size > 0, "All paths should set max_new_size");
- // Given the maximum gen0 size, determine the initial and
- // minimum gen0 sizes.
+ // Given the maximum young size, determine the initial and
+ // minimum young sizes.
if (_max_heap_byte_size == _initial_heap_byte_size) {
- // The maxium and initial heap sizes are the same so the generation's
+ // The maximum and initial heap sizes are the same so the generation's
// initial size must be the same as it maximum size. Use NewSize as the
// size if set on command line.
- size_t fixed_young_size = FLAG_IS_CMDLINE(NewSize) ? NewSize : max_new_size;
-
- _initial_gen0_size = fixed_young_size;
- _max_gen0_size = fixed_young_size;
+ _max_young_size = FLAG_IS_CMDLINE(NewSize) ? NewSize : _max_young_size;
+ _initial_young_size = _max_young_size;
// Also update the minimum size if min == initial == max.
if (_max_heap_byte_size == _min_heap_byte_size) {
- _min_gen0_size = fixed_young_size;
+ _min_young_size = _max_young_size;
}
} else {
- size_t desired_new_size = 0;
if (FLAG_IS_CMDLINE(NewSize)) {
// If NewSize is set on the command line, we should use it as
// the initial size, but make sure it is within the heap bounds.
- desired_new_size =
- MIN2(max_new_size, bound_minus_alignment(NewSize, _initial_heap_byte_size));
- _min_gen0_size = bound_minus_alignment(desired_new_size, _min_heap_byte_size);
+ _initial_young_size =
+ MIN2(_max_young_size, bound_minus_alignment(NewSize, _initial_heap_byte_size));
+ _min_young_size = bound_minus_alignment(_initial_young_size, _min_heap_byte_size);
} else {
// For the case where NewSize is not set on the command line, use
// NewRatio to size the initial generation size. Use the current
// NewSize as the floor, because if NewRatio is overly large, the resulting
// size can be too small.
- desired_new_size =
- MIN2(max_new_size, MAX2(scale_by_NewRatio_aligned(_initial_heap_byte_size), NewSize));
+ _initial_young_size =
+ MIN2(_max_young_size, MAX2(scale_by_NewRatio_aligned(_initial_heap_byte_size), NewSize));
}
- _initial_gen0_size = desired_new_size;
- _max_gen0_size = max_new_size;
- }
-
- // Write back to flags if necessary.
- if (NewSize != _initial_gen0_size) {
- FLAG_SET_ERGO(uintx, NewSize, _initial_gen0_size);
- }
-
- if (MaxNewSize != _max_gen0_size) {
- FLAG_SET_ERGO(uintx, MaxNewSize, _max_gen0_size);
}
if (PrintGCDetails && Verbose) {
- gclog_or_tty->print_cr("1: Minimum gen0 " SIZE_FORMAT " Initial gen0 "
- SIZE_FORMAT " Maximum gen0 " SIZE_FORMAT,
- _min_gen0_size, _initial_gen0_size, _max_gen0_size);
+ gclog_or_tty->print_cr("1: Minimum young " SIZE_FORMAT " Initial young "
+ SIZE_FORMAT " Maximum young " SIZE_FORMAT,
+ _min_young_size, _initial_young_size, _max_young_size);
}
// At this point the minimum, initial and maximum sizes
- // of the overall heap and of gen0 have been determined.
- // The maximum gen1 size can be determined from the maximum gen0
+ // of the overall heap and of the young generation have been determined.
+ // The maximum old size can be determined from the maximum young
// and maximum heap size since no explicit flags exist
- // for setting the gen1 maximum.
- _max_gen1_size = MAX2(_max_heap_byte_size - _max_gen0_size, _gen_alignment);
+ // for setting the old generation maximum.
+ _max_old_size = MAX2(_max_heap_byte_size - _max_young_size, _gen_alignment);
// If no explicit command line flag has been set for the
- // gen1 size, use what is left for gen1
+ // old generation size, use what is left.
if (!FLAG_IS_CMDLINE(OldSize)) {
// The user has not specified any value but the ergonomics
// may have chosen a value (which may or may not be consistent
// with the overall heap size). In either case make
// the minimum, maximum and initial sizes consistent
- // with the gen0 sizes and the overall heap sizes.
- _min_gen1_size = _gen_alignment;
- _initial_gen1_size = MIN2(_max_gen1_size, MAX2(_initial_heap_byte_size - _initial_gen0_size, _min_gen1_size));
- // _max_gen1_size has already been made consistent above
- FLAG_SET_ERGO(uintx, OldSize, _initial_gen1_size);
+ // with the young sizes and the overall heap sizes.
+ _min_old_size = _gen_alignment;
+ _initial_old_size = MIN2(_max_old_size, MAX2(_initial_heap_byte_size - _initial_young_size, _min_old_size));
+ // _max_old_size has already been made consistent above.
} else {
// OldSize has been explicitly set on the command line. Use it
// for the initial size but make sure the minimum allow a young
@@ -543,69 +523,68 @@
// with other command line flags, issue a warning.
// The generation minimums and the overall heap minimum should
// be within one generation alignment.
- if (OldSize > _max_gen1_size) {
+ if (_initial_old_size > _max_old_size) {
warning("Inconsistency between maximum heap size and maximum "
"generation sizes: using maximum heap = " SIZE_FORMAT
" -XX:OldSize flag is being ignored",
_max_heap_byte_size);
- FLAG_SET_ERGO(uintx, OldSize, _max_gen1_size);
+ _initial_old_size = _max_old_size;
}
- _min_gen1_size = MIN2(OldSize, _min_heap_byte_size - _min_gen0_size);
- _initial_gen1_size = OldSize;
+ _min_old_size = MIN2(_initial_old_size, _min_heap_byte_size - _min_young_size);
}
// The initial generation sizes should match the initial heap size,
// if not issue a warning and resize the generations. This behavior
// differs from JDK8 where the generation sizes have higher priority
// than the initial heap size.
- if ((_initial_gen1_size + _initial_gen0_size) != _initial_heap_byte_size) {
+ if ((_initial_old_size + _initial_young_size) != _initial_heap_byte_size) {
warning("Inconsistency between generation sizes and heap size, resizing "
"the generations to fit the heap.");
- size_t desired_gen0_size = _initial_heap_byte_size - _initial_gen1_size;
- if (_initial_heap_byte_size < _initial_gen1_size) {
+ size_t desired_young_size = _initial_heap_byte_size - _initial_old_size;
+ if (_initial_heap_byte_size < _initial_old_size) {
// Old want all memory, use minimum for young and rest for old
- _initial_gen0_size = _min_gen0_size;
- _initial_gen1_size = _initial_heap_byte_size - _min_gen0_size;
- } else if (desired_gen0_size > _max_gen0_size) {
+ _initial_young_size = _min_young_size;
+ _initial_old_size = _initial_heap_byte_size - _min_young_size;
+ } else if (desired_young_size > _max_young_size) {
// Need to increase both young and old generation
- _initial_gen0_size = _max_gen0_size;
- _initial_gen1_size = _initial_heap_byte_size - _max_gen0_size;
- } else if (desired_gen0_size < _min_gen0_size) {
+ _initial_young_size = _max_young_size;
+ _initial_old_size = _initial_heap_byte_size - _max_young_size;
+ } else if (desired_young_size < _min_young_size) {
// Need to decrease both young and old generation
- _initial_gen0_size = _min_gen0_size;
- _initial_gen1_size = _initial_heap_byte_size - _min_gen0_size;
+ _initial_young_size = _min_young_size;
+ _initial_old_size = _initial_heap_byte_size - _min_young_size;
} else {
// The young generation boundaries allow us to only update the
// young generation.
- _initial_gen0_size = desired_gen0_size;
+ _initial_young_size = desired_young_size;
}
if (PrintGCDetails && Verbose) {
- gclog_or_tty->print_cr("2: Minimum gen0 " SIZE_FORMAT " Initial gen0 "
- SIZE_FORMAT " Maximum gen0 " SIZE_FORMAT,
- _min_gen0_size, _initial_gen0_size, _max_gen0_size);
+ gclog_or_tty->print_cr("2: Minimum young " SIZE_FORMAT " Initial young "
+ SIZE_FORMAT " Maximum young " SIZE_FORMAT,
+ _min_young_size, _initial_young_size, _max_young_size);
}
}
- // Write back to flags if necessary
- if (NewSize != _initial_gen0_size) {
- FLAG_SET_ERGO(uintx, NewSize, _initial_gen0_size);
+ // Write back to flags if necessary.
+ if (NewSize != _initial_young_size) {
+ FLAG_SET_ERGO(uintx, NewSize, _initial_young_size);
}
- if (MaxNewSize != _max_gen0_size) {
- FLAG_SET_ERGO(uintx, MaxNewSize, _max_gen0_size);
+ if (MaxNewSize != _max_young_size) {
+ FLAG_SET_ERGO(uintx, MaxNewSize, _max_young_size);
}
- if (OldSize != _initial_gen1_size) {
- FLAG_SET_ERGO(uintx, OldSize, _initial_gen1_size);
+ if (OldSize != _initial_old_size) {
+ FLAG_SET_ERGO(uintx, OldSize, _initial_old_size);
}
if (PrintGCDetails && Verbose) {
- gclog_or_tty->print_cr("Minimum gen1 " SIZE_FORMAT " Initial gen1 "
- SIZE_FORMAT " Maximum gen1 " SIZE_FORMAT,
- _min_gen1_size, _initial_gen1_size, _max_gen1_size);
+ gclog_or_tty->print_cr("Minimum old " SIZE_FORMAT " Initial old "
+ SIZE_FORMAT " Maximum old " SIZE_FORMAT,
+ _min_old_size, _initial_old_size, _max_old_size);
}
DEBUG_ONLY(GenCollectorPolicy::assert_size_info();)
@@ -631,11 +610,11 @@
HandleMark hm; // Discard any handles allocated in each iteration.
// First allocation attempt is lock-free.
- Generation *gen0 = gch->get_gen(0);
- assert(gen0->supports_inline_contig_alloc(),
+ Generation *young = gch->get_gen(0);
+ assert(young->supports_inline_contig_alloc(),
"Otherwise, must do alloc within heap lock");
- if (gen0->should_allocate(size, is_tlab)) {
- result = gen0->par_allocate(size, is_tlab);
+ if (young->should_allocate(size, is_tlab)) {
+ result = young->par_allocate(size, is_tlab);
if (result != NULL) {
assert(gch->is_in_reserved(result), "result not in heap");
return result;
@@ -917,8 +896,8 @@
bool GenCollectorPolicy::should_try_older_generation_allocation(
size_t word_size) const {
GenCollectedHeap* gch = GenCollectedHeap::heap();
- size_t gen0_capacity = gch->get_gen(0)->capacity_before_gc();
- return (word_size > heap_word_size(gen0_capacity))
+ size_t young_capacity = gch->get_gen(0)->capacity_before_gc();
+ return (word_size > heap_word_size(young_capacity))
|| GC_locker::is_active_and_needs_gc()
|| gch->incremental_collection_failed();
}
@@ -940,11 +919,11 @@
}
if (UseParNewGC) {
- _generations[0] = new GenerationSpec(Generation::ParNew, _initial_gen0_size, _max_gen0_size);
+ _generations[0] = new GenerationSpec(Generation::ParNew, _initial_young_size, _max_young_size);
} else {
- _generations[0] = new GenerationSpec(Generation::DefNew, _initial_gen0_size, _max_gen0_size);
+ _generations[0] = new GenerationSpec(Generation::DefNew, _initial_young_size, _max_young_size);
}
- _generations[1] = new GenerationSpec(Generation::MarkSweepCompact, _initial_gen1_size, _max_gen1_size);
+ _generations[1] = new GenerationSpec(Generation::MarkSweepCompact, _initial_old_size, _max_old_size);
if (_generations[0] == NULL || _generations[1] == NULL) {
vm_exit_during_initialization("Unable to allocate gen spec");
@@ -978,18 +957,18 @@
flag_value = 20 * M;
set_basic_flag_values();
FLAG_SET_CMDLINE(uintx, NewSize, flag_value);
- verify_gen0_min(flag_value);
+ verify_young_min(flag_value);
set_basic_flag_values();
FLAG_SET_CMDLINE(uintx, NewSize, flag_value);
- verify_gen0_initial(flag_value);
+ verify_young_initial(flag_value);
// If NewSize is set on command line, but is larger than the min
// heap size, it should only be used for initial young size.
flag_value = 80 * M;
set_basic_flag_values();
FLAG_SET_CMDLINE(uintx, NewSize, flag_value);
- verify_gen0_initial(flag_value);
+ verify_young_initial(flag_value);
// If NewSize has been ergonomically set, the collector policy
// should use it for min but calculate the initial young size
@@ -997,11 +976,11 @@
flag_value = 20 * M;
set_basic_flag_values();
FLAG_SET_ERGO(uintx, NewSize, flag_value);
- verify_gen0_min(flag_value);
+ verify_young_min(flag_value);
set_basic_flag_values();
FLAG_SET_ERGO(uintx, NewSize, flag_value);
- verify_scaled_gen0_initial(InitialHeapSize);
+ verify_scaled_young_initial(InitialHeapSize);
restore_flags();
}
@@ -1016,11 +995,11 @@
flag_value = 20 * M;
set_basic_flag_values();
FLAG_SET_CMDLINE(uintx, OldSize, flag_value);
- verify_gen1_min(flag_value);
+ verify_old_min(flag_value);
set_basic_flag_values();
FLAG_SET_CMDLINE(uintx, OldSize, flag_value);
- verify_gen1_initial(flag_value);
+ verify_old_initial(flag_value);
// If MaxNewSize is large, the maximum OldSize will be less than
// what's requested on the command line and it should be reset
@@ -1031,46 +1010,46 @@
FLAG_SET_CMDLINE(uintx, MaxNewSize, 170*M);
// Calculate what we expect the flag to be.
flag_value = MaxHeapSize - MaxNewSize;
- verify_gen1_initial(flag_value);
+ verify_old_initial(flag_value);
}
- static void verify_gen0_min(size_t expected) {
+ static void verify_young_min(size_t expected) {
MarkSweepPolicy msp;
msp.initialize_all();
- assert(msp.min_gen0_size() <= expected, err_msg("%zu > %zu", msp.min_gen0_size(), expected));
+ assert(msp.min_young_size() <= expected, err_msg("%zu > %zu", msp.min_young_size(), expected));
}
- static void verify_gen0_initial(size_t expected) {
+ static void verify_young_initial(size_t expected) {
MarkSweepPolicy msp;
msp.initialize_all();
- assert(msp.initial_gen0_size() == expected, err_msg("%zu != %zu", msp.initial_gen0_size(), expected));
+ assert(msp.initial_young_size() == expected, err_msg("%zu != %zu", msp.initial_young_size(), expected));
}
- static void verify_scaled_gen0_initial(size_t initial_heap_size) {
+ static void verify_scaled_young_initial(size_t initial_heap_size) {
MarkSweepPolicy msp;
msp.initialize_all();
size_t expected = msp.scale_by_NewRatio_aligned(initial_heap_size);
- assert(msp.initial_gen0_size() == expected, err_msg("%zu != %zu", msp.initial_gen0_size(), expected));
+ assert(msp.initial_young_size() == expected, err_msg("%zu != %zu", msp.initial_young_size(), expected));
assert(FLAG_IS_ERGO(NewSize) && NewSize == expected,
err_msg("NewSize should have been set ergonomically to %zu, but was %zu", expected, NewSize));
}
- static void verify_gen1_min(size_t expected) {
+ static void verify_old_min(size_t expected) {
MarkSweepPolicy msp;
msp.initialize_all();
- assert(msp.min_gen1_size() <= expected, err_msg("%zu > %zu", msp.min_gen1_size(), expected));
+ assert(msp.min_old_size() <= expected, err_msg("%zu > %zu", msp.min_old_size(), expected));
}
- static void verify_gen1_initial(size_t expected) {
+ static void verify_old_initial(size_t expected) {
MarkSweepPolicy msp;
msp.initialize_all();
- assert(msp.initial_gen1_size() == expected, err_msg("%zu != %zu", msp.initial_gen1_size(), expected));
+ assert(msp.initial_old_size() == expected, err_msg("%zu != %zu", msp.initial_old_size(), expected));
}
--- a/hotspot/src/share/vm/memory/collectorPolicy.hpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/memory/collectorPolicy.hpp Wed Jul 05 19:46:31 2017 +0200
@@ -219,12 +219,12 @@
class GenCollectorPolicy : public CollectorPolicy {
friend class TestGenCollectorPolicy;
protected:
- size_t _min_gen0_size;
- size_t _initial_gen0_size;
- size_t _max_gen0_size;
- size_t _min_gen1_size;
- size_t _initial_gen1_size;
- size_t _max_gen1_size;
+ size_t _min_young_size;
+ size_t _initial_young_size;
+ size_t _max_young_size;
+ size_t _min_old_size;
+ size_t _initial_old_size;
+ size_t _max_old_size;
// _gen_alignment and _space_alignment will have the same value most of the
// time. When using large pages they can differ.
@@ -260,13 +260,13 @@
GenCollectorPolicy();
// Accessors
- size_t min_gen0_size() { return _min_gen0_size; }
- size_t initial_gen0_size() { return _initial_gen0_size; }
- size_t max_gen0_size() { return _max_gen0_size; }
- size_t gen_alignment() { return _gen_alignment; }
- size_t min_gen1_size() { return _min_gen1_size; }
- size_t initial_gen1_size() { return _initial_gen1_size; }
- size_t max_gen1_size() { return _max_gen1_size; }
+ size_t min_young_size() { return _min_young_size; }
+ size_t initial_young_size() { return _initial_young_size; }
+ size_t max_young_size() { return _max_young_size; }
+ size_t gen_alignment() { return _gen_alignment; }
+ size_t min_old_size() { return _min_old_size; }
+ size_t initial_old_size() { return _initial_old_size; }
+ size_t max_old_size() { return _max_old_size; }
int number_of_generations() { return 2; }
@@ -298,7 +298,7 @@
size_t init_survivor_size);
virtual void post_heap_initialize() {
- assert(_max_gen0_size == MaxNewSize, "Should be taken care of by initialize_size_info");
+ assert(_max_young_size == MaxNewSize, "Should be taken care of by initialize_size_info");
}
BarrierSet::Name barrier_set_name() { return BarrierSet::CardTableModRef; }
--- a/hotspot/src/share/vm/memory/genCollectedHeap.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/memory/genCollectedHeap.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -1119,10 +1119,10 @@
}
void GenCollectedHeap::print_tracing_info() const {
- if (TraceGen0Time) {
+ if (TraceYoungGenTime) {
get_gen(0)->print_summary_info();
}
- if (TraceGen1Time) {
+ if (TraceOldGenTime) {
get_gen(1)->print_summary_info();
}
}
--- a/hotspot/src/share/vm/memory/tenuredGeneration.hpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/memory/tenuredGeneration.hpp Wed Jul 05 19:46:31 2017 +0200
@@ -67,10 +67,9 @@
// Does a "full" (forced) collection invoked on this generation collect
// all younger generations as well? Note that this is a
// hack to allow the collection of the younger gen first if the flag is
- // set. This is better than using th policy's should_collect_gen0_first()
- // since that causes us to do an extra unnecessary pair of restart-&-stop-world.
+ // set.
virtual bool full_collects_younger_generations() const {
- return !CollectGen0First;
+ return !ScavengeBeforeFullGC;
}
virtual void gc_prologue(bool full);
--- a/hotspot/src/share/vm/oops/cpCache.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/oops/cpCache.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -407,7 +407,7 @@
oop ConstantPoolCacheEntry::appendix_if_resolved(constantPoolHandle cpool) {
- if (is_f1_null() || !has_appendix())
+ if (!has_appendix())
return NULL;
const int ref_index = f2_as_index() + _indy_resolved_references_appendix_offset;
objArrayOop resolved_references = cpool->resolved_references();
@@ -416,7 +416,7 @@
oop ConstantPoolCacheEntry::method_type_if_resolved(constantPoolHandle cpool) {
- if (is_f1_null() || !has_method_type())
+ if (!has_method_type())
return NULL;
const int ref_index = f2_as_index() + _indy_resolved_references_method_type_offset;
objArrayOop resolved_references = cpool->resolved_references();
--- a/hotspot/src/share/vm/oops/cpCache.hpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/oops/cpCache.hpp Wed Jul 05 19:46:31 2017 +0200
@@ -348,8 +348,8 @@
bool is_final() const { return (_flags & (1 << is_final_shift)) != 0; }
bool is_forced_virtual() const { return (_flags & (1 << is_forced_virtual_shift)) != 0; }
bool is_vfinal() const { return (_flags & (1 << is_vfinal_shift)) != 0; }
- bool has_appendix() const { return (_flags & (1 << has_appendix_shift)) != 0; }
- bool has_method_type() const { return (_flags & (1 << has_method_type_shift)) != 0; }
+ bool has_appendix() const { return (!is_f1_null()) && (_flags & (1 << has_appendix_shift)) != 0; }
+ bool has_method_type() const { return (!is_f1_null()) && (_flags & (1 << has_method_type_shift)) != 0; }
bool is_method_entry() const { return (_flags & (1 << is_field_entry_shift)) == 0; }
bool is_field_entry() const { return (_flags & (1 << is_field_entry_shift)) != 0; }
bool is_byte() const { return flag_state() == btos; }
--- a/hotspot/src/share/vm/oops/methodData.hpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/oops/methodData.hpp Wed Jul 05 19:46:31 2017 +0200
@@ -2053,7 +2053,7 @@
// Whole-method sticky bits and flags
enum {
- _trap_hist_limit = 20, // decoupled from Deoptimization::Reason_LIMIT
+ _trap_hist_limit = 21, // decoupled from Deoptimization::Reason_LIMIT
_trap_hist_mask = max_jubyte,
_extra_data_count = 4 // extra DataLayout headers, for trap history
}; // Public flag values
--- a/hotspot/src/share/vm/opto/addnode.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/addnode.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -254,47 +254,46 @@
const Type *t_sub1 = phase->type( in1->in(1) );
const Type *t_2 = phase->type( in2 );
if( t_sub1->singleton() && t_2->singleton() && t_sub1 != Type::TOP && t_2 != Type::TOP )
- return new (phase->C) SubINode(phase->makecon( add_ring( t_sub1, t_2 ) ),
- in1->in(2) );
+ return new SubINode(phase->makecon( add_ring( t_sub1, t_2 ) ), in1->in(2) );
// Convert "(a-b)+(c-d)" into "(a+c)-(b+d)"
if( op2 == Op_SubI ) {
// Check for dead cycle: d = (a-b)+(c-d)
assert( in1->in(2) != this && in2->in(2) != this,
"dead loop in AddINode::Ideal" );
- Node *sub = new (phase->C) SubINode(NULL, NULL);
- sub->init_req(1, phase->transform(new (phase->C) AddINode(in1->in(1), in2->in(1) ) ));
- sub->init_req(2, phase->transform(new (phase->C) AddINode(in1->in(2), in2->in(2) ) ));
+ Node *sub = new SubINode(NULL, NULL);
+ sub->init_req(1, phase->transform(new AddINode(in1->in(1), in2->in(1) ) ));
+ sub->init_req(2, phase->transform(new AddINode(in1->in(2), in2->in(2) ) ));
return sub;
}
// Convert "(a-b)+(b+c)" into "(a+c)"
if( op2 == Op_AddI && in1->in(2) == in2->in(1) ) {
assert(in1->in(1) != this && in2->in(2) != this,"dead loop in AddINode::Ideal");
- return new (phase->C) AddINode(in1->in(1), in2->in(2));
+ return new AddINode(in1->in(1), in2->in(2));
}
// Convert "(a-b)+(c+b)" into "(a+c)"
if( op2 == Op_AddI && in1->in(2) == in2->in(2) ) {
assert(in1->in(1) != this && in2->in(1) != this,"dead loop in AddINode::Ideal");
- return new (phase->C) AddINode(in1->in(1), in2->in(1));
+ return new AddINode(in1->in(1), in2->in(1));
}
// Convert "(a-b)+(b-c)" into "(a-c)"
if( op2 == Op_SubI && in1->in(2) == in2->in(1) ) {
assert(in1->in(1) != this && in2->in(2) != this,"dead loop in AddINode::Ideal");
- return new (phase->C) SubINode(in1->in(1), in2->in(2));
+ return new SubINode(in1->in(1), in2->in(2));
}
// Convert "(a-b)+(c-a)" into "(c-b)"
if( op2 == Op_SubI && in1->in(1) == in2->in(2) ) {
assert(in1->in(2) != this && in2->in(1) != this,"dead loop in AddINode::Ideal");
- return new (phase->C) SubINode(in2->in(1), in1->in(2));
+ return new SubINode(in2->in(1), in1->in(2));
}
}
// Convert "x+(0-y)" into "(x-y)"
if( op2 == Op_SubI && phase->type(in2->in(1)) == TypeInt::ZERO )
- return new (phase->C) SubINode(in1, in2->in(2) );
+ return new SubINode(in1, in2->in(2) );
// Convert "(0-y)+x" into "(x-y)"
if( op1 == Op_SubI && phase->type(in1->in(1)) == TypeInt::ZERO )
- return new (phase->C) SubINode( in2, in1->in(2) );
+ return new SubINode( in2, in1->in(2) );
// Convert (x>>>z)+y into (x+(y<<z))>>>z for small constant z and y.
// Helps with array allocation math constant folding
@@ -315,8 +314,8 @@
if( z < 5 && -5 < y && y < 0 ) {
const Type *t_in11 = phase->type(in1->in(1));
if( t_in11 != Type::TOP && (t_in11->is_int()->_lo >= -(y << z)) ) {
- Node *a = phase->transform( new (phase->C) AddINode( in1->in(1), phase->intcon(y<<z) ) );
- return new (phase->C) URShiftINode( a, in1->in(2) );
+ Node *a = phase->transform( new AddINode( in1->in(1), phase->intcon(y<<z) ) );
+ return new URShiftINode( a, in1->in(2) );
}
}
}
@@ -387,47 +386,46 @@
const Type *t_sub1 = phase->type( in1->in(1) );
const Type *t_2 = phase->type( in2 );
if( t_sub1->singleton() && t_2->singleton() && t_sub1 != Type::TOP && t_2 != Type::TOP )
- return new (phase->C) SubLNode(phase->makecon( add_ring( t_sub1, t_2 ) ),
- in1->in(2) );
+ return new SubLNode(phase->makecon( add_ring( t_sub1, t_2 ) ), in1->in(2) );
// Convert "(a-b)+(c-d)" into "(a+c)-(b+d)"
if( op2 == Op_SubL ) {
// Check for dead cycle: d = (a-b)+(c-d)
assert( in1->in(2) != this && in2->in(2) != this,
"dead loop in AddLNode::Ideal" );
- Node *sub = new (phase->C) SubLNode(NULL, NULL);
- sub->init_req(1, phase->transform(new (phase->C) AddLNode(in1->in(1), in2->in(1) ) ));
- sub->init_req(2, phase->transform(new (phase->C) AddLNode(in1->in(2), in2->in(2) ) ));
+ Node *sub = new SubLNode(NULL, NULL);
+ sub->init_req(1, phase->transform(new AddLNode(in1->in(1), in2->in(1) ) ));
+ sub->init_req(2, phase->transform(new AddLNode(in1->in(2), in2->in(2) ) ));
return sub;
}
// Convert "(a-b)+(b+c)" into "(a+c)"
if( op2 == Op_AddL && in1->in(2) == in2->in(1) ) {
assert(in1->in(1) != this && in2->in(2) != this,"dead loop in AddLNode::Ideal");
- return new (phase->C) AddLNode(in1->in(1), in2->in(2));
+ return new AddLNode(in1->in(1), in2->in(2));
}
// Convert "(a-b)+(c+b)" into "(a+c)"
if( op2 == Op_AddL && in1->in(2) == in2->in(2) ) {
assert(in1->in(1) != this && in2->in(1) != this,"dead loop in AddLNode::Ideal");
- return new (phase->C) AddLNode(in1->in(1), in2->in(1));
+ return new AddLNode(in1->in(1), in2->in(1));
}
// Convert "(a-b)+(b-c)" into "(a-c)"
if( op2 == Op_SubL && in1->in(2) == in2->in(1) ) {
assert(in1->in(1) != this && in2->in(2) != this,"dead loop in AddLNode::Ideal");
- return new (phase->C) SubLNode(in1->in(1), in2->in(2));
+ return new SubLNode(in1->in(1), in2->in(2));
}
// Convert "(a-b)+(c-a)" into "(c-b)"
if( op2 == Op_SubL && in1->in(1) == in1->in(2) ) {
assert(in1->in(2) != this && in2->in(1) != this,"dead loop in AddLNode::Ideal");
- return new (phase->C) SubLNode(in2->in(1), in1->in(2));
+ return new SubLNode(in2->in(1), in1->in(2));
}
}
// Convert "x+(0-y)" into "(x-y)"
if( op2 == Op_SubL && phase->type(in2->in(1)) == TypeLong::ZERO )
- return new (phase->C) SubLNode( in1, in2->in(2) );
+ return new SubLNode( in1, in2->in(2) );
// Convert "(0-y)+x" into "(x-y)"
if( op1 == Op_SubL && phase->type(in1->in(1)) == TypeInt::ZERO )
- return new (phase->C) SubLNode( in2, in1->in(2) );
+ return new SubLNode( in2, in1->in(2) );
// Convert "X+X+X+X+X...+X+Y" into "k*X+Y" or really convert "X+(X+Y)"
// into "(X<<1)+Y" and let shift-folding happen.
@@ -435,8 +433,8 @@
in2->in(1) == in1 &&
op1 != Op_ConL &&
0 ) {
- Node *shift = phase->transform(new (phase->C) LShiftLNode(in1,phase->intcon(1)));
- return new (phase->C) AddLNode(shift,in2->in(2));
+ Node *shift = phase->transform(new LShiftLNode(in1,phase->intcon(1)));
+ return new AddLNode(shift,in2->in(2));
}
return AddNode::Ideal(phase, can_reshape);
@@ -596,7 +594,7 @@
offset = phase->MakeConX(t2->get_con() + t12->get_con());
} else {
// Else move the constant to the right. ((A+con)+B) into ((A+B)+con)
- address = phase->transform(new (phase->C) AddPNode(in(Base),addp->in(Address),in(Offset)));
+ address = phase->transform(new AddPNode(in(Base),addp->in(Address),in(Offset)));
offset = addp->in(Offset);
}
PhaseIterGVN *igvn = phase->is_IterGVN();
@@ -616,7 +614,7 @@
// If this is a NULL+long form (from unsafe accesses), switch to a rawptr.
if (phase->type(in(Address)) == TypePtr::NULL_PTR) {
Node* offset = in(Offset);
- return new (phase->C) CastX2PNode(offset);
+ return new CastX2PNode(offset);
}
}
@@ -628,7 +626,7 @@
if( add->Opcode() == Op_AddX && add->in(1) != add ) {
const Type *t22 = phase->type( add->in(2) );
if( t22->singleton() && (t22 != Type::TOP) ) { // Right input is an add of a constant?
- set_req(Address, phase->transform(new (phase->C) AddPNode(in(Base),in(Address),add->in(1))));
+ set_req(Address, phase->transform(new AddPNode(in(Base),in(Address),add->in(1))));
set_req(Offset, add->in(2));
PhaseIterGVN *igvn = phase->is_IterGVN();
if (add->outcnt() == 0 && igvn) {
@@ -858,7 +856,7 @@
// to force a right-spline graph for the rest of MinINode::Ideal().
if( l->Opcode() == Op_MinI ) {
assert( l != l->in(1), "dead loop in MinINode::Ideal" );
- r = phase->transform(new (phase->C) MinINode(l->in(2),r));
+ r = phase->transform(new MinINode(l->in(2),r));
l = l->in(1);
set_req(1, l);
set_req(2, r);
@@ -906,18 +904,18 @@
}
if( x->_idx > y->_idx )
- return new (phase->C) MinINode(r->in(1),phase->transform(new (phase->C) MinINode(l,r->in(2))));
+ return new MinINode(r->in(1),phase->transform(new MinINode(l,r->in(2))));
// See if covers: MIN2(x+c0,MIN2(y+c1,z))
if( !phase->eqv(x,y) ) return NULL;
// If (y == x) transform MIN2(x+c0, MIN2(x+c1,z)) into
// MIN2(x+c0 or x+c1 which less, z).
- return new (phase->C) MinINode(phase->transform(new (phase->C) AddINode(x,phase->intcon(MIN2(x_off,y_off)))),r->in(2));
+ return new MinINode(phase->transform(new AddINode(x,phase->intcon(MIN2(x_off,y_off)))),r->in(2));
} else {
// See if covers: MIN2(x+c0,y+c1)
if( !phase->eqv(x,y) ) return NULL;
// If (y == x) transform MIN2(x+c0,x+c1) into x+c0 or x+c1 which less.
- return new (phase->C) AddINode(x,phase->intcon(MIN2(x_off,y_off)));
+ return new AddINode(x,phase->intcon(MIN2(x_off,y_off)));
}
}
--- a/hotspot/src/share/vm/opto/block.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/block.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -373,7 +373,7 @@
// I'll need a few machine-specific GotoNodes. Make an Ideal GotoNode,
// then Match it into a machine-specific Node. Then clone the machine
// Node on demand.
- Node *x = new (C) GotoNode(NULL);
+ Node *x = new GotoNode(NULL);
x->init_req(0, x);
_goto = matcher.match_tree(x);
assert(_goto != NULL, "");
@@ -426,7 +426,7 @@
!p->is_block_start() );
// Make the block begin with one of Region or StartNode.
if( !p->is_block_start() ) {
- RegionNode *r = new (C) RegionNode( 2 );
+ RegionNode *r = new RegionNode( 2 );
r->init_req(1, p); // Insert RegionNode in the way
proj->set_req(0, r); // Insert RegionNode in the way
p = r;
@@ -501,7 +501,7 @@
// get ProjNode corresponding to the succ_no'th successor of the in block
ProjNode* proj = in->get_node(in->number_of_nodes() - in->_num_succs + succ_no)->as_Proj();
// create region for basic block
- RegionNode* region = new (C) RegionNode(2);
+ RegionNode* region = new RegionNode(2);
region->init_req(1, proj);
// setup corresponding basic block
Block* block = new (_block_arena) Block(_block_arena, region);
--- a/hotspot/src/share/vm/opto/bytecodeInfo.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/bytecodeInfo.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -361,11 +361,14 @@
set_msg("not an accessor");
return false;
}
+
+ // Limit inlining depth in case inlining is forced or
+ // _max_inline_level was increased to compensate for lambda forms.
+ if (inline_level() > MaxForceInlineLevel) {
+ set_msg("MaxForceInlineLevel");
+ return false;
+ }
if (inline_level() > _max_inline_level) {
- if (callee_method->force_inline() && inline_level() > MaxForceInlineLevel) {
- set_msg("MaxForceInlineLevel");
- return false;
- }
if (!callee_method->force_inline() || !IncrementalInline) {
set_msg("inlining too deep");
return false;
--- a/hotspot/src/share/vm/opto/c2_globals.hpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/c2_globals.hpp Wed Jul 05 19:46:31 2017 +0200
@@ -650,9 +650,6 @@
product(bool, UseMathExactIntrinsics, true, \
"Enables intrinsification of various java.lang.Math functions") \
\
- experimental(bool, ReplaceInParentMaps, false, \
- "Propagate type improvements in callers of inlinee if possible") \
- \
product(bool, UseTypeSpeculation, true, \
"Speculatively propagate types from profiles") \
\
--- a/hotspot/src/share/vm/opto/callGenerator.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/callGenerator.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -63,12 +63,12 @@
}
virtual bool is_parse() const { return true; }
- virtual JVMState* generate(JVMState* jvms, Parse* parent_parser);
+ virtual JVMState* generate(JVMState* jvms);
int is_osr() { return _is_osr; }
};
-JVMState* ParseGenerator::generate(JVMState* jvms, Parse* parent_parser) {
+JVMState* ParseGenerator::generate(JVMState* jvms) {
Compile* C = Compile::current();
C->print_inlining_update(this);
@@ -81,7 +81,7 @@
return NULL; // bailing out of the compile; do not try to parse
}
- Parse parser(jvms, method(), _expected_uses, parent_parser);
+ Parse parser(jvms, method(), _expected_uses);
// Grab signature for matching/allocation
#ifdef ASSERT
if (parser.tf() != (parser.depth() == 1 ? C->tf() : tf())) {
@@ -120,12 +120,12 @@
_separate_io_proj(separate_io_proj)
{
}
- virtual JVMState* generate(JVMState* jvms, Parse* parent_parser);
+ virtual JVMState* generate(JVMState* jvms);
CallStaticJavaNode* call_node() const { return _call_node; }
};
-JVMState* DirectCallGenerator::generate(JVMState* jvms, Parse* parent_parser) {
+JVMState* DirectCallGenerator::generate(JVMState* jvms) {
GraphKit kit(jvms);
kit.C->print_inlining_update(this);
bool is_static = method()->is_static();
@@ -136,7 +136,7 @@
kit.C->log()->elem("direct_call bci='%d'", jvms->bci());
}
- CallStaticJavaNode *call = new (kit.C) CallStaticJavaNode(kit.C, tf(), target, method(), kit.bci());
+ CallStaticJavaNode *call = new CallStaticJavaNode(kit.C, tf(), target, method(), kit.bci());
_call_node = call; // Save the call node in case we need it later
if (!is_static) {
// Make an explicit receiver null_check as part of this call.
@@ -173,10 +173,10 @@
vtable_index >= 0, "either invalid or usable");
}
virtual bool is_virtual() const { return true; }
- virtual JVMState* generate(JVMState* jvms, Parse* parent_parser);
+ virtual JVMState* generate(JVMState* jvms);
};
-JVMState* VirtualCallGenerator::generate(JVMState* jvms, Parse* parent_parser) {
+JVMState* VirtualCallGenerator::generate(JVMState* jvms) {
GraphKit kit(jvms);
Node* receiver = kit.argument(0);
@@ -225,7 +225,7 @@
"no vtable calls if +UseInlineCaches ");
address target = SharedRuntime::get_resolve_virtual_call_stub();
// Normal inline cache used for call
- CallDynamicJavaNode *call = new (kit.C) CallDynamicJavaNode(tf(), target, method(), _vtable_index, kit.bci());
+ CallDynamicJavaNode *call = new CallDynamicJavaNode(tf(), target, method(), _vtable_index, kit.bci());
kit.set_arguments_for_java_call(call);
kit.set_edges_for_java_call(call);
Node* ret = kit.set_results_for_java_call(call);
@@ -283,7 +283,7 @@
// Convert the CallStaticJava into an inline
virtual void do_late_inline();
- virtual JVMState* generate(JVMState* jvms, Parse* parent_parser) {
+ virtual JVMState* generate(JVMState* jvms) {
Compile *C = Compile::current();
C->log_inline_id(this);
@@ -298,7 +298,7 @@
// that the late inlining logic can distinguish between fall
// through and exceptional uses of the memory and io projections
// as is done for allocations and macro expansion.
- return DirectCallGenerator::generate(jvms, parent_parser);
+ return DirectCallGenerator::generate(jvms);
}
virtual void print_inlining_late(const char* msg) {
@@ -350,7 +350,7 @@
JVMState* old_jvms = call->jvms();
JVMState* jvms = old_jvms->clone_shallow(C);
uint size = call->req();
- SafePointNode* map = new (C) SafePointNode(size, jvms);
+ SafePointNode* map = new SafePointNode(size, jvms);
for (uint i1 = 0; i1 < size; i1++) {
map->init_req(i1, call->in(i1));
}
@@ -399,7 +399,7 @@
}
// Now perform the inlining using the synthesized JVMState
- JVMState* new_jvms = _inline_cg->generate(jvms, NULL);
+ JVMState* new_jvms = _inline_cg->generate(jvms);
if (new_jvms == NULL) return; // no change
if (C->failing()) return;
@@ -417,7 +417,7 @@
C->env()->notice_inlined_method(_inline_cg->method());
C->set_inlining_progress(true);
- kit.replace_call(call, result);
+ kit.replace_call(call, result, true);
}
@@ -439,8 +439,8 @@
virtual bool is_mh_late_inline() const { return true; }
- virtual JVMState* generate(JVMState* jvms, Parse* parent_parser) {
- JVMState* new_jvms = LateInlineCallGenerator::generate(jvms, parent_parser);
+ virtual JVMState* generate(JVMState* jvms) {
+ JVMState* new_jvms = LateInlineCallGenerator::generate(jvms);
Compile* C = Compile::current();
if (_input_not_const) {
@@ -486,14 +486,14 @@
LateInlineStringCallGenerator(ciMethod* method, CallGenerator* inline_cg) :
LateInlineCallGenerator(method, inline_cg) {}
- virtual JVMState* generate(JVMState* jvms, Parse* parent_parser) {
+ virtual JVMState* generate(JVMState* jvms) {
Compile *C = Compile::current();
C->log_inline_id(this);
C->add_string_late_inline(this);
- JVMState* new_jvms = DirectCallGenerator::generate(jvms, parent_parser);
+ JVMState* new_jvms = DirectCallGenerator::generate(jvms);
return new_jvms;
}
@@ -510,14 +510,14 @@
LateInlineBoxingCallGenerator(ciMethod* method, CallGenerator* inline_cg) :
LateInlineCallGenerator(method, inline_cg) {}
- virtual JVMState* generate(JVMState* jvms, Parse* parent_parser) {
+ virtual JVMState* generate(JVMState* jvms) {
Compile *C = Compile::current();
C->log_inline_id(this);
C->add_boxing_late_inline(this);
- JVMState* new_jvms = DirectCallGenerator::generate(jvms, parent_parser);
+ JVMState* new_jvms = DirectCallGenerator::generate(jvms);
return new_jvms;
}
};
@@ -553,7 +553,7 @@
virtual bool is_virtual() const { return _is_virtual; }
virtual bool is_deferred() const { return true; }
- virtual JVMState* generate(JVMState* jvms, Parse* parent_parser);
+ virtual JVMState* generate(JVMState* jvms);
};
@@ -563,14 +563,14 @@
return new WarmCallGenerator(ci, if_cold, if_hot);
}
-JVMState* WarmCallGenerator::generate(JVMState* jvms, Parse* parent_parser) {
+JVMState* WarmCallGenerator::generate(JVMState* jvms) {
Compile* C = Compile::current();
C->print_inlining_update(this);
if (C->log() != NULL) {
C->log()->elem("warm_call bci='%d'", jvms->bci());
}
- jvms = _if_cold->generate(jvms, parent_parser);
+ jvms = _if_cold->generate(jvms);
if (jvms != NULL) {
Node* m = jvms->map()->control();
if (m->is_CatchProj()) m = m->in(0); else m = C->top();
@@ -631,7 +631,7 @@
virtual bool is_inline() const { return _if_hit->is_inline(); }
virtual bool is_deferred() const { return _if_hit->is_deferred(); }
- virtual JVMState* generate(JVMState* jvms, Parse* parent_parser);
+ virtual JVMState* generate(JVMState* jvms);
};
@@ -643,14 +643,13 @@
}
-JVMState* PredictedCallGenerator::generate(JVMState* jvms, Parse* parent_parser) {
+JVMState* PredictedCallGenerator::generate(JVMState* jvms) {
GraphKit kit(jvms);
kit.C->print_inlining_update(this);
PhaseGVN& gvn = kit.gvn();
// We need an explicit receiver null_check before checking its type.
// We share a map with the caller, so his JVMS gets adjusted.
Node* receiver = kit.argument(0);
-
CompileLog* log = kit.C->log();
if (log != NULL) {
log->elem("predicted_call bci='%d' klass='%d'",
@@ -662,6 +661,10 @@
return kit.transfer_exceptions_into_jvms();
}
+ // Make a copy of the replaced nodes in case we need to restore them
+ ReplacedNodes replaced_nodes = kit.map()->replaced_nodes();
+ replaced_nodes.clone();
+
Node* exact_receiver = receiver; // will get updated in place...
Node* slow_ctl = kit.type_check_receiver(receiver,
_predicted_receiver, _hit_prob,
@@ -672,7 +675,7 @@
{ PreserveJVMState pjvms(&kit);
kit.set_control(slow_ctl);
if (!kit.stopped()) {
- slow_jvms = _if_missed->generate(kit.sync_jvms(), parent_parser);
+ slow_jvms = _if_missed->generate(kit.sync_jvms());
if (kit.failing())
return NULL; // might happen because of NodeCountInliningCutoff
assert(slow_jvms != NULL, "must be");
@@ -693,12 +696,12 @@
kit.replace_in_map(receiver, exact_receiver);
// Make the hot call:
- JVMState* new_jvms = _if_hit->generate(kit.sync_jvms(), parent_parser);
+ JVMState* new_jvms = _if_hit->generate(kit.sync_jvms());
if (new_jvms == NULL) {
// Inline failed, so make a direct call.
assert(_if_hit->is_inline(), "must have been a failed inline");
CallGenerator* cg = CallGenerator::for_direct_call(_if_hit->method());
- new_jvms = cg->generate(kit.sync_jvms(), parent_parser);
+ new_jvms = cg->generate(kit.sync_jvms());
}
kit.add_exception_states_from(new_jvms);
kit.set_jvms(new_jvms);
@@ -715,16 +718,29 @@
return kit.transfer_exceptions_into_jvms();
}
+ // There are 2 branches and the replaced nodes are only valid on
+ // one: restore the replaced nodes to what they were before the
+ // branch.
+ kit.map()->set_replaced_nodes(replaced_nodes);
+
// Finish the diamond.
kit.C->set_has_split_ifs(true); // Has chance for split-if optimization
- RegionNode* region = new (kit.C) RegionNode(3);
+ RegionNode* region = new RegionNode(3);
region->init_req(1, kit.control());
region->init_req(2, slow_map->control());
kit.set_control(gvn.transform(region));
Node* iophi = PhiNode::make(region, kit.i_o(), Type::ABIO);
iophi->set_req(2, slow_map->i_o());
kit.set_i_o(gvn.transform(iophi));
+ // Merge memory
kit.merge_memory(slow_map->merged_memory(), region, 2);
+ // Transform new memory Phis.
+ for (MergeMemStream mms(kit.merged_memory()); mms.next_non_empty();) {
+ Node* phi = mms.memory();
+ if (phi->is_Phi() && phi->in(0) == region) {
+ mms.set_memory(gvn.transform(phi));
+ }
+ }
uint tos = kit.jvms()->stkoff() + kit.sp();
uint limit = slow_map->req();
for (uint i = TypeFunc::Parms; i < limit; i++) {
@@ -825,7 +841,7 @@
const TypeOopPtr* arg_type = arg->bottom_type()->isa_oopptr();
const Type* sig_type = TypeOopPtr::make_from_klass(signature->accessing_klass());
if (arg_type != NULL && !arg_type->higher_equal(sig_type)) {
- Node* cast_obj = gvn.transform(new (C) CheckCastPPNode(kit.control(), arg, sig_type));
+ Node* cast_obj = gvn.transform(new CheckCastPPNode(kit.control(), arg, sig_type));
kit.set_argument(0, cast_obj);
}
}
@@ -837,7 +853,7 @@
const TypeOopPtr* arg_type = arg->bottom_type()->isa_oopptr();
const Type* sig_type = TypeOopPtr::make_from_klass(t->as_klass());
if (arg_type != NULL && !arg_type->higher_equal(sig_type)) {
- Node* cast_obj = gvn.transform(new (C) CheckCastPPNode(kit.control(), arg, sig_type));
+ Node* cast_obj = gvn.transform(new CheckCastPPNode(kit.control(), arg, sig_type));
kit.set_argument(receiver_skip + i, cast_obj);
}
}
@@ -882,15 +898,15 @@
}
-//------------------------PredictedIntrinsicGenerator------------------------------
-// Internal class which handles all predicted Intrinsic calls.
-class PredictedIntrinsicGenerator : public CallGenerator {
+//------------------------PredicatedIntrinsicGenerator------------------------------
+// Internal class which handles all predicated Intrinsic calls.
+class PredicatedIntrinsicGenerator : public CallGenerator {
CallGenerator* _intrinsic;
CallGenerator* _cg;
public:
- PredictedIntrinsicGenerator(CallGenerator* intrinsic,
- CallGenerator* cg)
+ PredicatedIntrinsicGenerator(CallGenerator* intrinsic,
+ CallGenerator* cg)
: CallGenerator(cg->method())
{
_intrinsic = intrinsic;
@@ -901,108 +917,186 @@
virtual bool is_inlined() const { return true; }
virtual bool is_intrinsic() const { return true; }
- virtual JVMState* generate(JVMState* jvms, Parse* parent_parser);
+ virtual JVMState* generate(JVMState* jvms);
};
-CallGenerator* CallGenerator::for_predicted_intrinsic(CallGenerator* intrinsic,
- CallGenerator* cg) {
- return new PredictedIntrinsicGenerator(intrinsic, cg);
+CallGenerator* CallGenerator::for_predicated_intrinsic(CallGenerator* intrinsic,
+ CallGenerator* cg) {
+ return new PredicatedIntrinsicGenerator(intrinsic, cg);
}
-JVMState* PredictedIntrinsicGenerator::generate(JVMState* jvms, Parse* parent_parser) {
+JVMState* PredicatedIntrinsicGenerator::generate(JVMState* jvms) {
+ // The code we want to generate here is:
+ // if (receiver == NULL)
+ // uncommon_Trap
+ // if (predicate(0))
+ // do_intrinsic(0)
+ // else
+ // if (predicate(1))
+ // do_intrinsic(1)
+ // ...
+ // else
+ // do_java_comp
+
GraphKit kit(jvms);
PhaseGVN& gvn = kit.gvn();
CompileLog* log = kit.C->log();
if (log != NULL) {
- log->elem("predicted_intrinsic bci='%d' method='%d'",
+ log->elem("predicated_intrinsic bci='%d' method='%d'",
jvms->bci(), log->identify(method()));
}
- Node* slow_ctl = _intrinsic->generate_predicate(kit.sync_jvms());
- if (kit.failing())
- return NULL; // might happen because of NodeCountInliningCutoff
-
- kit.C->print_inlining_update(this);
- SafePointNode* slow_map = NULL;
- JVMState* slow_jvms;
- if (slow_ctl != NULL) {
- PreserveJVMState pjvms(&kit);
- kit.set_control(slow_ctl);
- if (!kit.stopped()) {
- slow_jvms = _cg->generate(kit.sync_jvms(), parent_parser);
- if (kit.failing())
- return NULL; // might happen because of NodeCountInliningCutoff
- assert(slow_jvms != NULL, "must be");
- kit.add_exception_states_from(slow_jvms);
- kit.set_map(slow_jvms->map());
- if (!kit.stopped())
- slow_map = kit.stop();
+ if (!method()->is_static()) {
+ // We need an explicit receiver null_check before checking its type in predicate.
+ // We share a map with the caller, so his JVMS gets adjusted.
+ Node* receiver = kit.null_check_receiver_before_call(method());
+ if (kit.stopped()) {
+ return kit.transfer_exceptions_into_jvms();
}
}
- if (kit.stopped()) {
- // Predicate is always false.
- kit.set_jvms(slow_jvms);
+ int n_predicates = _intrinsic->predicates_count();
+ assert(n_predicates > 0, "sanity");
+
+ JVMState** result_jvms = NEW_RESOURCE_ARRAY(JVMState*, (n_predicates+1));
+
+ // Region for normal compilation code if intrinsic failed.
+ Node* slow_region = new RegionNode(1);
+
+ int results = 0;
+ for (int predicate = 0; (predicate < n_predicates) && !kit.stopped(); predicate++) {
+#ifdef ASSERT
+ JVMState* old_jvms = kit.jvms();
+ SafePointNode* old_map = kit.map();
+ Node* old_io = old_map->i_o();
+ Node* old_mem = old_map->memory();
+ Node* old_exc = old_map->next_exception();
+#endif
+ Node* else_ctrl = _intrinsic->generate_predicate(kit.sync_jvms(), predicate);
+#ifdef ASSERT
+ // Assert(no_new_memory && no_new_io && no_new_exceptions) after generate_predicate.
+ assert(old_jvms == kit.jvms(), "generate_predicate should not change jvm state");
+ SafePointNode* new_map = kit.map();
+ assert(old_io == new_map->i_o(), "generate_predicate should not change i_o");
+ assert(old_mem == new_map->memory(), "generate_predicate should not change memory");
+ assert(old_exc == new_map->next_exception(), "generate_predicate should not add exceptions");
+#endif
+ if (!kit.stopped()) {
+ PreserveJVMState pjvms(&kit);
+ // Generate intrinsic code:
+ JVMState* new_jvms = _intrinsic->generate(kit.sync_jvms());
+ if (new_jvms == NULL) {
+ // Intrinsic failed, use normal compilation path for this predicate.
+ slow_region->add_req(kit.control());
+ } else {
+ kit.add_exception_states_from(new_jvms);
+ kit.set_jvms(new_jvms);
+ if (!kit.stopped()) {
+ result_jvms[results++] = kit.jvms();
+ }
+ }
+ }
+ if (else_ctrl == NULL) {
+ else_ctrl = kit.C->top();
+ }
+ kit.set_control(else_ctrl);
+ }
+ if (!kit.stopped()) {
+ // Final 'else' after predicates.
+ slow_region->add_req(kit.control());
+ }
+ if (slow_region->req() > 1) {
+ PreserveJVMState pjvms(&kit);
+ // Generate normal compilation code:
+ kit.set_control(gvn.transform(slow_region));
+ JVMState* new_jvms = _cg->generate(kit.sync_jvms());
+ if (kit.failing())
+ return NULL; // might happen because of NodeCountInliningCutoff
+ assert(new_jvms != NULL, "must be");
+ kit.add_exception_states_from(new_jvms);
+ kit.set_jvms(new_jvms);
+ if (!kit.stopped()) {
+ result_jvms[results++] = kit.jvms();
+ }
+ }
+
+ if (results == 0) {
+ // All paths ended in uncommon traps.
+ (void) kit.stop();
return kit.transfer_exceptions_into_jvms();
}
- // Generate intrinsic code:
- JVMState* new_jvms = _intrinsic->generate(kit.sync_jvms(), parent_parser);
- if (new_jvms == NULL) {
- // Intrinsic failed, so use slow code or make a direct call.
- if (slow_map == NULL) {
- CallGenerator* cg = CallGenerator::for_direct_call(method());
- new_jvms = cg->generate(kit.sync_jvms(), parent_parser);
- } else {
- kit.set_jvms(slow_jvms);
- return kit.transfer_exceptions_into_jvms();
- }
- }
- kit.add_exception_states_from(new_jvms);
- kit.set_jvms(new_jvms);
-
- // Need to merge slow and fast?
- if (slow_map == NULL) {
- // The fast path is the only path remaining.
+ if (results == 1) { // Only one path
+ kit.set_jvms(result_jvms[0]);
return kit.transfer_exceptions_into_jvms();
}
- if (kit.stopped()) {
- // Intrinsic method threw an exception, so it's just the slow path after all.
- kit.set_jvms(slow_jvms);
- return kit.transfer_exceptions_into_jvms();
+ // Merge all paths.
+ kit.C->set_has_split_ifs(true); // Has chance for split-if optimization
+ RegionNode* region = new RegionNode(results + 1);
+ Node* iophi = PhiNode::make(region, kit.i_o(), Type::ABIO);
+ for (int i = 0; i < results; i++) {
+ JVMState* jvms = result_jvms[i];
+ int path = i + 1;
+ SafePointNode* map = jvms->map();
+ region->init_req(path, map->control());
+ iophi->set_req(path, map->i_o());
+ if (i == 0) {
+ kit.set_jvms(jvms);
+ } else {
+ kit.merge_memory(map->merged_memory(), region, path);
+ }
+ }
+ kit.set_control(gvn.transform(region));
+ kit.set_i_o(gvn.transform(iophi));
+ // Transform new memory Phis.
+ for (MergeMemStream mms(kit.merged_memory()); mms.next_non_empty();) {
+ Node* phi = mms.memory();
+ if (phi->is_Phi() && phi->in(0) == region) {
+ mms.set_memory(gvn.transform(phi));
+ }
}
- // Finish the diamond.
- kit.C->set_has_split_ifs(true); // Has chance for split-if optimization
- RegionNode* region = new (kit.C) RegionNode(3);
- region->init_req(1, kit.control());
- region->init_req(2, slow_map->control());
- kit.set_control(gvn.transform(region));
- Node* iophi = PhiNode::make(region, kit.i_o(), Type::ABIO);
- iophi->set_req(2, slow_map->i_o());
- kit.set_i_o(gvn.transform(iophi));
- kit.merge_memory(slow_map->merged_memory(), region, 2);
+ // Merge debug info.
+ Node** ins = NEW_RESOURCE_ARRAY(Node*, results);
uint tos = kit.jvms()->stkoff() + kit.sp();
- uint limit = slow_map->req();
+ Node* map = kit.map();
+ uint limit = map->req();
for (uint i = TypeFunc::Parms; i < limit; i++) {
// Skip unused stack slots; fast forward to monoff();
if (i == tos) {
i = kit.jvms()->monoff();
if( i >= limit ) break;
}
- Node* m = kit.map()->in(i);
- Node* n = slow_map->in(i);
- if (m != n) {
- const Type* t = gvn.type(m)->meet_speculative(gvn.type(n));
- Node* phi = PhiNode::make(region, m, t);
- phi->set_req(2, n);
- kit.map()->set_req(i, gvn.transform(phi));
+ Node* n = map->in(i);
+ ins[0] = n;
+ const Type* t = gvn.type(n);
+ bool needs_phi = false;
+ for (int j = 1; j < results; j++) {
+ JVMState* jvms = result_jvms[j];
+ Node* jmap = jvms->map();
+ Node* m = NULL;
+ if (jmap->req() > i) {
+ m = jmap->in(i);
+ if (m != n) {
+ needs_phi = true;
+ t = t->meet_speculative(gvn.type(m));
+ }
+ }
+ ins[j] = m;
+ }
+ if (needs_phi) {
+ Node* phi = PhiNode::make(region, n, t);
+ for (int j = 1; j < results; j++) {
+ phi->set_req(j + 1, ins[j]);
+ }
+ map->set_req(i, gvn.transform(phi));
}
}
+
return kit.transfer_exceptions_into_jvms();
}
@@ -1025,7 +1119,7 @@
virtual bool is_virtual() const { ShouldNotReachHere(); return false; }
virtual bool is_trap() const { return true; }
- virtual JVMState* generate(JVMState* jvms, Parse* parent_parser);
+ virtual JVMState* generate(JVMState* jvms);
};
@@ -1037,7 +1131,7 @@
}
-JVMState* UncommonTrapCallGenerator::generate(JVMState* jvms, Parse* parent_parser) {
+JVMState* UncommonTrapCallGenerator::generate(JVMState* jvms) {
GraphKit kit(jvms);
kit.C->print_inlining_update(this);
// Take the trap with arguments pushed on the stack. (Cf. null_check_receiver).
--- a/hotspot/src/share/vm/opto/callGenerator.hpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/callGenerator.hpp Wed Jul 05 19:46:31 2017 +0200
@@ -31,8 +31,6 @@
#include "opto/type.hpp"
#include "runtime/deoptimization.hpp"
-class Parse;
-
//---------------------------CallGenerator-------------------------------------
// The subclasses of this class handle generation of ideal nodes for
// call sites and method entry points.
@@ -63,8 +61,9 @@
virtual bool is_virtual() const { return false; }
// is_deferred: The decision whether to inline or not is deferred.
virtual bool is_deferred() const { return false; }
- // is_predicted: Uses an explicit check against a predicted type.
- virtual bool is_predicted() const { return false; }
+ // is_predicated: Uses an explicit check (predicate).
+ virtual bool is_predicated() const { return false; }
+ virtual int predicates_count() const { return 0; }
// is_trap: Does not return to the caller. (E.g., uncommon trap.)
virtual bool is_trap() const { return false; }
// does_virtual_dispatch: Should try inlining as normal method first.
@@ -114,7 +113,7 @@
//
// If the result is NULL, it means that this CallGenerator was unable
// to handle the given call, and another CallGenerator should be consulted.
- virtual JVMState* generate(JVMState* jvms, Parse* parent_parser) = 0;
+ virtual JVMState* generate(JVMState* jvms) = 0;
// How to generate a call site that is inlined:
static CallGenerator* for_inline(ciMethod* m, float expected_uses = -1);
@@ -160,9 +159,9 @@
// Registry for intrinsics:
static CallGenerator* for_intrinsic(ciMethod* m);
static void register_intrinsic(ciMethod* m, CallGenerator* cg);
- static CallGenerator* for_predicted_intrinsic(CallGenerator* intrinsic,
- CallGenerator* cg);
- virtual Node* generate_predicate(JVMState* jvms) { return NULL; };
+ static CallGenerator* for_predicated_intrinsic(CallGenerator* intrinsic,
+ CallGenerator* cg);
+ virtual Node* generate_predicate(JVMState* jvms, int predicate) { return NULL; };
virtual void print_inlining_late(const char* msg) { ShouldNotReachHere(); }
--- a/hotspot/src/share/vm/opto/callnode.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/callnode.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -74,20 +74,20 @@
case TypeFunc::Control:
case TypeFunc::I_O:
case TypeFunc::Memory:
- return new (match->C) MachProjNode(this,proj->_con,RegMask::Empty,MachProjNode::unmatched_proj);
+ return new MachProjNode(this,proj->_con,RegMask::Empty,MachProjNode::unmatched_proj);
case TypeFunc::FramePtr:
- return new (match->C) MachProjNode(this,proj->_con,Matcher::c_frame_ptr_mask, Op_RegP);
+ return new MachProjNode(this,proj->_con,Matcher::c_frame_ptr_mask, Op_RegP);
case TypeFunc::ReturnAdr:
- return new (match->C) MachProjNode(this,proj->_con,match->_return_addr_mask,Op_RegP);
+ return new MachProjNode(this,proj->_con,match->_return_addr_mask,Op_RegP);
case TypeFunc::Parms:
default: {
uint parm_num = proj->_con - TypeFunc::Parms;
const Type *t = _domain->field_at(proj->_con);
if (t->base() == Type::Half) // 2nd half of Longs and Doubles
- return new (match->C) ConNode(Type::TOP);
+ return new ConNode(Type::TOP);
uint ideal_reg = t->ideal_reg();
RegMask &rm = match->_calling_convention_mask[parm_num];
- return new (match->C) MachProjNode(this,proj->_con,rm,ideal_reg);
+ return new MachProjNode(this,proj->_con,rm,ideal_reg);
}
}
return NULL;
@@ -685,12 +685,12 @@
case TypeFunc::Control:
case TypeFunc::I_O:
case TypeFunc::Memory:
- return new (match->C) MachProjNode(this,proj->_con,RegMask::Empty,MachProjNode::unmatched_proj);
+ return new MachProjNode(this,proj->_con,RegMask::Empty,MachProjNode::unmatched_proj);
case TypeFunc::Parms+1: // For LONG & DOUBLE returns
assert(tf()->_range->field_at(TypeFunc::Parms+1) == Type::HALF, "");
// 2nd half of doubles and longs
- return new (match->C) MachProjNode(this,proj->_con, RegMask::Empty, (uint)OptoReg::Bad);
+ return new MachProjNode(this,proj->_con, RegMask::Empty, (uint)OptoReg::Bad);
case TypeFunc::Parms: { // Normal returns
uint ideal_reg = tf()->range()->field_at(TypeFunc::Parms)->ideal_reg();
@@ -700,7 +700,7 @@
RegMask rm = RegMask(regs.first());
if( OptoReg::is_valid(regs.second()) )
rm.Insert( regs.second() );
- return new (match->C) MachProjNode(this,proj->_con,rm,ideal_reg);
+ return new MachProjNode(this,proj->_con,rm,ideal_reg);
}
case TypeFunc::ReturnAdr:
@@ -1090,6 +1090,7 @@
#ifndef PRODUCT
void SafePointNode::dump_spec(outputStream *st) const {
st->print(" SafePoint ");
+ _replaced_nodes.dump(st);
}
#endif
@@ -1288,10 +1289,10 @@
Node* nproj = catchproj->clone();
igvn->register_new_node_with_optimizer(nproj);
- Node *frame = new (phase->C) ParmNode( phase->C->start(), TypeFunc::FramePtr );
+ Node *frame = new ParmNode( phase->C->start(), TypeFunc::FramePtr );
frame = phase->transform(frame);
// Halt & Catch Fire
- Node *halt = new (phase->C) HaltNode( nproj, frame );
+ Node *halt = new HaltNode( nproj, frame );
phase->C->root()->add_req(halt);
phase->transform(halt);
@@ -1333,7 +1334,7 @@
if (!allow_new_nodes) return NULL;
// Create a cast which is control dependent on the initialization to
// propagate the fact that the array length must be positive.
- length = new (phase->C) CastIINode(length, narrow_length_type);
+ length = new CastIINode(length, narrow_length_type);
length->set_req(0, initialization()->proj_out(0));
}
}
--- a/hotspot/src/share/vm/opto/callnode.hpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/callnode.hpp Wed Jul 05 19:46:31 2017 +0200
@@ -30,6 +30,7 @@
#include "opto/multnode.hpp"
#include "opto/opcodes.hpp"
#include "opto/phaseX.hpp"
+#include "opto/replacednodes.hpp"
#include "opto/type.hpp"
// Portions of code courtesy of Clifford Click
@@ -335,6 +336,7 @@
OopMap* _oop_map; // Array of OopMap info (8-bit char) for GC
JVMState* const _jvms; // Pointer to list of JVM State objects
const TypePtr* _adr_type; // What type of memory does this node produce?
+ ReplacedNodes _replaced_nodes; // During parsing: list of pair of nodes from calls to GraphKit::replace_in_map()
// Many calls take *all* of memory as input,
// but some produce a limited subset of that memory as output.
@@ -426,6 +428,37 @@
void set_next_exception(SafePointNode* n);
bool has_exceptions() const { return next_exception() != NULL; }
+ // Helper methods to operate on replaced nodes
+ ReplacedNodes replaced_nodes() const {
+ return _replaced_nodes;
+ }
+
+ void set_replaced_nodes(ReplacedNodes replaced_nodes) {
+ _replaced_nodes = replaced_nodes;
+ }
+
+ void clone_replaced_nodes() {
+ _replaced_nodes.clone();
+ }
+ void record_replaced_node(Node* initial, Node* improved) {
+ _replaced_nodes.record(initial, improved);
+ }
+ void transfer_replaced_nodes_from(SafePointNode* sfpt, uint idx = 0) {
+ _replaced_nodes.transfer_from(sfpt->_replaced_nodes, idx);
+ }
+ void delete_replaced_nodes() {
+ _replaced_nodes.reset();
+ }
+ void apply_replaced_nodes() {
+ _replaced_nodes.apply(this);
+ }
+ void merge_replaced_nodes_with(SafePointNode* sfpt) {
+ _replaced_nodes.merge_with(sfpt->_replaced_nodes);
+ }
+ bool has_replaced_nodes() const {
+ return !_replaced_nodes.is_empty();
+ }
+
// Standard Node stuff
virtual int Opcode() const;
virtual bool pinned() const { return true; }
--- a/hotspot/src/share/vm/opto/castnode.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/castnode.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -228,11 +228,11 @@
Node* dispX,
bool negate = false) {
if (negate) {
- dispX = new (phase->C) SubXNode(phase->MakeConX(0), phase->transform(dispX));
+ dispX = new SubXNode(phase->MakeConX(0), phase->transform(dispX));
}
- return new (phase->C) AddPNode(phase->C->top(),
- phase->transform(new (phase->C) CastX2PNode(base)),
- phase->transform(dispX));
+ return new AddPNode(phase->C->top(),
+ phase->transform(new CastX2PNode(base)),
+ phase->transform(dispX));
}
Node *CastX2PNode::Ideal(PhaseGVN *phase, bool can_reshape) {
--- a/hotspot/src/share/vm/opto/cfgnode.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/cfgnode.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -662,17 +662,17 @@
convf2i->in(1) == bot_in ) {
// Matched pattern, including LShiftI; RShiftI, replace with integer compares
// max test
- Node *cmp = gvn->register_new_node_with_optimizer(new (phase->C) CmpINode( convf2i, min ));
- Node *boo = gvn->register_new_node_with_optimizer(new (phase->C) BoolNode( cmp, BoolTest::lt ));
- IfNode *iff = (IfNode*)gvn->register_new_node_with_optimizer(new (phase->C) IfNode( top_if->in(0), boo, PROB_UNLIKELY_MAG(5), top_if->_fcnt ));
- Node *if_min= gvn->register_new_node_with_optimizer(new (phase->C) IfTrueNode (iff));
- Node *ifF = gvn->register_new_node_with_optimizer(new (phase->C) IfFalseNode(iff));
+ Node *cmp = gvn->register_new_node_with_optimizer(new CmpINode( convf2i, min ));
+ Node *boo = gvn->register_new_node_with_optimizer(new BoolNode( cmp, BoolTest::lt ));
+ IfNode *iff = (IfNode*)gvn->register_new_node_with_optimizer(new IfNode( top_if->in(0), boo, PROB_UNLIKELY_MAG(5), top_if->_fcnt ));
+ Node *if_min= gvn->register_new_node_with_optimizer(new IfTrueNode (iff));
+ Node *ifF = gvn->register_new_node_with_optimizer(new IfFalseNode(iff));
// min test
- cmp = gvn->register_new_node_with_optimizer(new (phase->C) CmpINode( convf2i, max ));
- boo = gvn->register_new_node_with_optimizer(new (phase->C) BoolNode( cmp, BoolTest::gt ));
- iff = (IfNode*)gvn->register_new_node_with_optimizer(new (phase->C) IfNode( ifF, boo, PROB_UNLIKELY_MAG(5), bot_if->_fcnt ));
- Node *if_max= gvn->register_new_node_with_optimizer(new (phase->C) IfTrueNode (iff));
- ifF = gvn->register_new_node_with_optimizer(new (phase->C) IfFalseNode(iff));
+ cmp = gvn->register_new_node_with_optimizer(new CmpINode( convf2i, max ));
+ boo = gvn->register_new_node_with_optimizer(new BoolNode( cmp, BoolTest::gt ));
+ iff = (IfNode*)gvn->register_new_node_with_optimizer(new IfNode( ifF, boo, PROB_UNLIKELY_MAG(5), bot_if->_fcnt ));
+ Node *if_max= gvn->register_new_node_with_optimizer(new IfTrueNode (iff));
+ ifF = gvn->register_new_node_with_optimizer(new IfFalseNode(iff));
// update input edges to region node
set_req_X( min_idx, if_min, gvn );
set_req_X( max_idx, if_max, gvn );
@@ -731,7 +731,7 @@
PhiNode* PhiNode::make(Node* r, Node* x, const Type *t, const TypePtr* at) {
uint preds = r->req(); // Number of predecessor paths
assert(t != Type::MEMORY || at == flatten_phi_adr_type(at), "flatten at");
- PhiNode* p = new (Compile::current()) PhiNode(r, t, at);
+ PhiNode* p = new PhiNode(r, t, at);
for (uint j = 1; j < preds; j++) {
// Fill in all inputs, except those which the region does not yet have
if (r->in(j) != NULL)
@@ -749,7 +749,7 @@
const Type* t = x->bottom_type();
const TypePtr* at = NULL;
if (t == Type::MEMORY) at = flatten_phi_adr_type(x->adr_type());
- return new (Compile::current()) PhiNode(r, t, at);
+ return new PhiNode(r, t, at);
}
@@ -1258,9 +1258,9 @@
} else return NULL;
// Build int->bool conversion
- Node *n = new (phase->C) Conv2BNode( cmp->in(1) );
+ Node *n = new Conv2BNode( cmp->in(1) );
if( flipped )
- n = new (phase->C) XorINode( phase->transform(n), phase->intcon(1) );
+ n = new XorINode( phase->transform(n), phase->intcon(1) );
return n;
}
@@ -1320,9 +1320,9 @@
if( q->is_Con() && phase->type(q) != TypeInt::ZERO && y->is_Con() )
return NULL;
- Node *cmplt = phase->transform( new (phase->C) CmpLTMaskNode(p,q) );
- Node *j_and = phase->transform( new (phase->C) AndINode(cmplt,y) );
- return new (phase->C) AddINode(j_and,x);
+ Node *cmplt = phase->transform( new CmpLTMaskNode(p,q) );
+ Node *j_and = phase->transform( new AndINode(cmplt,y) );
+ return new AddINode(j_and,x);
}
//------------------------------is_absolute------------------------------------
@@ -1384,17 +1384,17 @@
if( sub->Opcode() != Op_SubF ||
sub->in(2) != x ||
phase->type(sub->in(1)) != tzero ) return NULL;
- x = new (phase->C) AbsFNode(x);
+ x = new AbsFNode(x);
if (flip) {
- x = new (phase->C) SubFNode(sub->in(1), phase->transform(x));
+ x = new SubFNode(sub->in(1), phase->transform(x));
}
} else {
if( sub->Opcode() != Op_SubD ||
sub->in(2) != x ||
phase->type(sub->in(1)) != tzero ) return NULL;
- x = new (phase->C) AbsDNode(x);
+ x = new AbsDNode(x);
if (flip) {
- x = new (phase->C) SubDNode(sub->in(1), phase->transform(x));
+ x = new SubDNode(sub->in(1), phase->transform(x));
}
}
@@ -1469,7 +1469,7 @@
// Now start splitting out the flow paths that merge the same value.
// Split first the RegionNode.
PhaseIterGVN *igvn = phase->is_IterGVN();
- RegionNode *newr = new (phase->C) RegionNode(hit+1);
+ RegionNode *newr = new RegionNode(hit+1);
split_once(igvn, phi, val, r, newr);
// Now split all other Phis than this one
@@ -1781,13 +1781,13 @@
}
if (doit) {
if (base == NULL) {
- base = new (phase->C) PhiNode(in(0), type, NULL);
+ base = new PhiNode(in(0), type, NULL);
for (uint i = 1; i < req(); i++) {
base->init_req(i, in(i)->in(AddPNode::Base));
}
phase->is_IterGVN()->register_new_node_with_optimizer(base);
}
- return new (phase->C) AddPNode(base, base, y);
+ return new AddPNode(base, base, y);
}
}
}
@@ -1864,7 +1864,7 @@
// Phi(...MergeMem(m0, m1:AT1, m2:AT2)...) into
// MergeMem(Phi(...m0...), Phi:AT1(...m1...), Phi:AT2(...m2...))
PhaseIterGVN *igvn = phase->is_IterGVN();
- Node* hook = new (phase->C) Node(1);
+ Node* hook = new Node(1);
PhiNode* new_base = (PhiNode*) clone();
// Must eagerly register phis, since they participate in loops.
if (igvn) {
@@ -1961,7 +1961,7 @@
} else {
narrow_t = TypeNarrowKlass::make(this->bottom_type()->is_ptr());
}
- PhiNode* new_phi = new (phase->C) PhiNode(r, narrow_t);
+ PhiNode* new_phi = new PhiNode(r, narrow_t);
uint orig_cnt = req();
for (uint i=1; i<req(); ++i) {// For all paths in
Node *ii = in(i);
@@ -1975,9 +1975,9 @@
new_ii = new_phi;
} else {
if (is_decodeN) {
- new_ii = new (phase->C) EncodePNode(ii, narrow_t);
+ new_ii = new EncodePNode(ii, narrow_t);
} else {
- new_ii = new (phase->C) EncodePKlassNode(ii, narrow_t);
+ new_ii = new EncodePKlassNode(ii, narrow_t);
}
igvn->register_new_node_with_optimizer(new_ii);
}
@@ -1986,9 +1986,9 @@
}
igvn->register_new_node_with_optimizer(new_phi, this);
if (is_decodeN) {
- progress = new (phase->C) DecodeNNode(new_phi, bottom_type());
+ progress = new DecodeNNode(new_phi, bottom_type());
} else {
- progress = new (phase->C) DecodeNKlassNode(new_phi, bottom_type());
+ progress = new DecodeNKlassNode(new_phi, bottom_type());
}
}
}
--- a/hotspot/src/share/vm/opto/chaitin.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/chaitin.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -1730,7 +1730,7 @@
// Now we see we need a base-Phi here to merge the bases
const Type *t = base->bottom_type();
- base = new (C) PhiNode( derived->in(0), t );
+ base = new PhiNode( derived->in(0), t );
for( i = 1; i < derived->req(); i++ ) {
base->init_req(i, find_base_for_derived(derived_base_map, derived->in(i), maxlrg));
t = t->meet(base->in(i)->bottom_type());
@@ -1800,7 +1800,7 @@
Block *phi_block = _cfg.get_block_for_node(phi);
if (_cfg.get_block_for_node(phi_block->pred(2)) == block) {
const RegMask *mask = C->matcher()->idealreg2spillmask[Op_RegI];
- Node *spill = new (C) MachSpillCopyNode(MachSpillCopyNode::LoopPhiInput, phi, *mask, *mask);
+ Node *spill = new MachSpillCopyNode(MachSpillCopyNode::LoopPhiInput, phi, *mask, *mask);
insert_proj( phi_block, 1, spill, maxlrg++ );
n->set_req(1,spill);
must_recompute_live = true;
--- a/hotspot/src/share/vm/opto/coalesce.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/coalesce.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -291,7 +291,7 @@
_phc.clone_projs(pred, pred->end_idx(), m, copy, _phc._lrg_map);
} else {
const RegMask *rm = C->matcher()->idealreg2spillmask[m->ideal_reg()];
- copy = new (C) MachSpillCopyNode(MachSpillCopyNode::PhiInput, m, *rm, *rm);
+ copy = new MachSpillCopyNode(MachSpillCopyNode::PhiInput, m, *rm, *rm);
// Find a good place to insert. Kinda tricky, use a subroutine
insert_copy_with_overlap(pred,copy,phi_name,src_name);
}
@@ -325,7 +325,7 @@
l += _phc.clone_projs(b, l, m, copy, _phc._lrg_map);
} else {
const RegMask *rm = C->matcher()->idealreg2spillmask[m->ideal_reg()];
- copy = new (C) MachSpillCopyNode(MachSpillCopyNode::TwoAddress, m, *rm, *rm);
+ copy = new MachSpillCopyNode(MachSpillCopyNode::TwoAddress, m, *rm, *rm);
// Insert the copy in the basic block, just before us
b->insert_node(copy, l++);
}
@@ -372,7 +372,7 @@
continue; // Live out; do not pre-split
// Split the lrg at this use
const RegMask *rm = C->matcher()->idealreg2spillmask[inp->ideal_reg()];
- Node* copy = new (C) MachSpillCopyNode(MachSpillCopyNode::DebugUse, inp, *rm, *rm);
+ Node* copy = new MachSpillCopyNode(MachSpillCopyNode::DebugUse, inp, *rm, *rm);
// Insert the copy in the use-def chain
n->set_req(inpidx, copy );
// Insert the copy in the basic block, just before us
--- a/hotspot/src/share/vm/opto/compile.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/compile.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -95,7 +95,7 @@
// Constant table base node singleton.
MachConstantBaseNode* Compile::mach_constant_base_node() {
if (_mach_constant_base_node == NULL) {
- _mach_constant_base_node = new (C) MachConstantBaseNode();
+ _mach_constant_base_node = new MachConstantBaseNode();
_mach_constant_base_node->add_req(C->root());
}
return _mach_constant_base_node;
@@ -392,6 +392,11 @@
uint next = 0;
while (next < useful.size()) {
Node *n = useful.at(next++);
+ if (n->is_SafePoint()) {
+ // We're done with a parsing phase. Replaced nodes are not valid
+ // beyond that point.
+ n->as_SafePoint()->delete_replaced_nodes();
+ }
// Use raw traversal of out edges since this code removes out edges
int max = n->outcnt();
for (int j = 0; j < max; ++j) {
@@ -673,7 +678,6 @@
_print_inlining_stream(NULL),
_print_inlining_idx(0),
_print_inlining_output(NULL),
- _preserve_jvm_state(0),
_interpreter_frame_size(0) {
C = this;
@@ -748,14 +752,14 @@
const TypeTuple *domain = StartOSRNode::osr_domain();
const TypeTuple *range = TypeTuple::make_range(method()->signature());
init_tf(TypeFunc::make(domain, range));
- StartNode* s = new (this) StartOSRNode(root(), domain);
+ StartNode* s = new StartOSRNode(root(), domain);
initial_gvn()->set_type_bottom(s);
init_start(s);
cg = CallGenerator::for_osr(method(), entry_bci());
} else {
// Normal case.
init_tf(TypeFunc::make(method()));
- StartNode* s = new (this) StartNode(root(), tf()->domain());
+ StartNode* s = new StartNode(root(), tf()->domain());
initial_gvn()->set_type_bottom(s);
init_start(s);
if (method()->intrinsic_id() == vmIntrinsics::_Reference_get && UseG1GC) {
@@ -783,7 +787,7 @@
return;
}
JVMState* jvms = build_start_state(start(), tf());
- if ((jvms = cg->generate(jvms, NULL)) == NULL) {
+ if ((jvms = cg->generate(jvms)) == NULL) {
record_method_not_compilable("method parse failed");
return;
}
@@ -980,7 +984,6 @@
_print_inlining_stream(NULL),
_print_inlining_idx(0),
_print_inlining_output(NULL),
- _preserve_jvm_state(0),
_allowed_reasons(0),
_interpreter_frame_size(0) {
C = this;
@@ -1061,9 +1064,9 @@
// Globally visible Nodes
// First set TOP to NULL to give safe behavior during creation of RootNode
set_cached_top_node(NULL);
- set_root(new (this) RootNode());
+ set_root(new RootNode());
// Now that you have a Root to point to, create the real TOP
- set_cached_top_node( new (this) ConNode(Type::TOP) );
+ set_cached_top_node( new ConNode(Type::TOP) );
set_recent_alloc(NULL, NULL);
// Create Debug Information Recorder to record scopes, oopmaps, etc.
@@ -1914,6 +1917,8 @@
for_igvn()->clear();
gvn->replace_with(&igvn);
+ _late_inlines_pos = _late_inlines.length();
+
while (_boxing_late_inlines.length() > 0) {
CallGenerator* cg = _boxing_late_inlines.pop();
cg->do_late_inline();
@@ -1977,8 +1982,8 @@
if (live_nodes() > (uint)LiveNodeCountInliningCutoff) {
if (low_live_nodes < (uint)LiveNodeCountInliningCutoff * 8 / 10) {
// PhaseIdealLoop is expensive so we only try it once we are
- // out of loop and we only try it again if the previous helped
- // got the number of nodes down significantly
+ // out of live nodes and we only try it again if the previous
+ // helped got the number of nodes down significantly
PhaseIdealLoop ideal_loop( igvn, false, true );
if (failing()) return;
low_live_nodes = live_nodes();
@@ -2072,6 +2077,10 @@
// Inline valueOf() methods now.
inline_boxing_calls(igvn);
+ if (AlwaysIncrementalInline) {
+ inline_incrementally(igvn);
+ }
+
print_method(PHASE_INCREMENTAL_BOXING_INLINE, 2);
if (failing()) return;
@@ -2757,9 +2766,9 @@
// Decode a narrow oop to match address
// [R12 + narrow_oop_reg<<3 + offset]
if (t->isa_oopptr()) {
- nn = new (this) DecodeNNode(nn, t);
+ nn = new DecodeNNode(nn, t);
} else {
- nn = new (this) DecodeNKlassNode(nn, t);
+ nn = new DecodeNKlassNode(nn, t);
}
n->set_req(AddPNode::Base, nn);
n->set_req(AddPNode::Address, nn);
@@ -2880,7 +2889,7 @@
}
}
if (new_in2 != NULL) {
- Node* cmpN = new (this) CmpNNode(in1->in(1), new_in2);
+ Node* cmpN = new CmpNNode(in1->in(1), new_in2);
n->subsume_by(cmpN, this);
if (in1->outcnt() == 0) {
in1->disconnect_inputs(NULL, this);
@@ -2979,8 +2988,8 @@
n->subsume_by(divmod->mod_proj(), this);
} else {
// replace a%b with a-((a/b)*b)
- Node* mult = new (this) MulINode(d, d->in(2));
- Node* sub = new (this) SubINode(d->in(1), mult);
+ Node* mult = new MulINode(d, d->in(2));
+ Node* sub = new SubINode(d->in(1), mult);
n->subsume_by(sub, this);
}
}
@@ -2999,8 +3008,8 @@
n->subsume_by(divmod->mod_proj(), this);
} else {
// replace a%b with a-((a/b)*b)
- Node* mult = new (this) MulLNode(d, d->in(2));
- Node* sub = new (this) SubLNode(d->in(1), mult);
+ Node* mult = new MulLNode(d, d->in(2));
+ Node* sub = new SubLNode(d->in(1), mult);
n->subsume_by(sub, this);
}
}
@@ -3049,7 +3058,7 @@
}
} else {
if (t == NULL || t->_lo < 0 || t->_hi > (int)mask) {
- Node* shift = new (this) AndINode(in2, ConNode::make(this, TypeInt::make(mask)));
+ Node* shift = new AndINode(in2, ConNode::make(this, TypeInt::make(mask)));
n->set_req(2, shift);
}
}
--- a/hotspot/src/share/vm/opto/compile.hpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/compile.hpp Wed Jul 05 19:46:31 2017 +0200
@@ -431,9 +431,6 @@
// Remove the speculative part of types and clean up the graph
void remove_speculative_types(PhaseIterGVN &igvn);
- // Are we within a PreserveJVMState block?
- int _preserve_jvm_state;
-
void* _replay_inline_data; // Pointer to data loaded from file
void print_inlining_init();
@@ -1198,21 +1195,6 @@
// Auxiliary method for randomized fuzzing/stressing
static bool randomized_select(int count);
-
- // enter a PreserveJVMState block
- void inc_preserve_jvm_state() {
- _preserve_jvm_state++;
- }
-
- // exit a PreserveJVMState block
- void dec_preserve_jvm_state() {
- _preserve_jvm_state--;
- assert(_preserve_jvm_state >= 0, "_preserve_jvm_state shouldn't be negative");
- }
-
- bool has_preserve_jvm_state() const {
- return _preserve_jvm_state > 0;
- }
};
#endif // SHARE_VM_OPTO_COMPILE_HPP
--- a/hotspot/src/share/vm/opto/connode.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/connode.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -45,17 +45,17 @@
//------------------------------make-------------------------------------------
ConNode *ConNode::make( Compile* C, const Type *t ) {
switch( t->basic_type() ) {
- case T_INT: return new (C) ConINode( t->is_int() );
- case T_LONG: return new (C) ConLNode( t->is_long() );
- case T_FLOAT: return new (C) ConFNode( t->is_float_constant() );
- case T_DOUBLE: return new (C) ConDNode( t->is_double_constant() );
- case T_VOID: return new (C) ConNode ( Type::TOP );
- case T_OBJECT: return new (C) ConPNode( t->is_ptr() );
- case T_ARRAY: return new (C) ConPNode( t->is_aryptr() );
- case T_ADDRESS: return new (C) ConPNode( t->is_ptr() );
- case T_NARROWOOP: return new (C) ConNNode( t->is_narrowoop() );
- case T_NARROWKLASS: return new (C) ConNKlassNode( t->is_narrowklass() );
- case T_METADATA: return new (C) ConPNode( t->is_ptr() );
+ case T_INT: return new ConINode( t->is_int() );
+ case T_LONG: return new ConLNode( t->is_long() );
+ case T_FLOAT: return new ConFNode( t->is_float_constant() );
+ case T_DOUBLE: return new ConDNode( t->is_double_constant() );
+ case T_VOID: return new ConNode ( Type::TOP );
+ case T_OBJECT: return new ConPNode( t->is_ptr() );
+ case T_ARRAY: return new ConPNode( t->is_aryptr() );
+ case T_ADDRESS: return new ConPNode( t->is_ptr() );
+ case T_NARROWOOP: return new ConNNode( t->is_narrowoop() );
+ case T_NARROWKLASS: return new ConNKlassNode( t->is_narrowklass() );
+ case T_METADATA: return new ConPNode( t->is_ptr() );
// Expected cases: TypePtr::NULL_PTR, any is_rawptr()
// Also seen: AnyPtr(TopPTR *+top); from command line:
// r -XX:+PrintOpto -XX:CIStart=285 -XX:+CompileTheWorld -XX:CompileTheWorldStartAt=660
--- a/hotspot/src/share/vm/opto/connode.hpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/connode.hpp Wed Jul 05 19:46:31 2017 +0200
@@ -58,7 +58,7 @@
// Factory method:
static ConINode* make( Compile* C, int con ) {
- return new (C) ConINode( TypeInt::make(con) );
+ return new ConINode( TypeInt::make(con) );
}
};
@@ -73,9 +73,9 @@
// Factory methods:
static ConPNode* make( Compile *C ,address con ) {
if (con == NULL)
- return new (C) ConPNode( TypePtr::NULL_PTR ) ;
+ return new ConPNode( TypePtr::NULL_PTR ) ;
else
- return new (C) ConPNode( TypeRawPtr::make(con) );
+ return new ConPNode( TypeRawPtr::make(con) );
}
};
@@ -106,7 +106,7 @@
// Factory method:
static ConLNode* make( Compile *C ,jlong con ) {
- return new (C) ConLNode( TypeLong::make(con) );
+ return new ConLNode( TypeLong::make(con) );
}
};
@@ -120,7 +120,7 @@
// Factory method:
static ConFNode* make( Compile *C, float con ) {
- return new (C) ConFNode( TypeF::make(con) );
+ return new ConFNode( TypeF::make(con) );
}
};
@@ -134,7 +134,7 @@
// Factory method:
static ConDNode* make( Compile *C, double con ) {
- return new (C) ConDNode( TypeD::make(con) );
+ return new ConDNode( TypeD::make(con) );
}
};
--- a/hotspot/src/share/vm/opto/convertnode.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/convertnode.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -374,11 +374,11 @@
ryhi = -rylo0;
}
- Node* cx = phase->transform( new (phase->C) ConvI2LNode(x, TypeLong::make(rxlo, rxhi, widen)) );
- Node* cy = phase->transform( new (phase->C) ConvI2LNode(y, TypeLong::make(rylo, ryhi, widen)) );
+ Node* cx = phase->transform( new ConvI2LNode(x, TypeLong::make(rxlo, rxhi, widen)) );
+ Node* cy = phase->transform( new ConvI2LNode(y, TypeLong::make(rylo, ryhi, widen)) );
switch (op) {
- case Op_AddI: return new (phase->C) AddLNode(cx, cy);
- case Op_SubI: return new (phase->C) SubLNode(cx, cy);
+ case Op_AddI: return new AddLNode(cx, cy);
+ case Op_SubI: return new SubLNode(cx, cy);
default: ShouldNotReachHere();
}
}
@@ -452,9 +452,9 @@
assert( x != andl && y != andl, "dead loop in ConvL2INode::Ideal" );
if (phase->type(x) == Type::TOP) return NULL;
if (phase->type(y) == Type::TOP) return NULL;
- Node *add1 = phase->transform(new (phase->C) ConvL2INode(x));
- Node *add2 = phase->transform(new (phase->C) ConvL2INode(y));
- return new (phase->C) AddINode(add1,add2);
+ Node *add1 = phase->transform(new ConvL2INode(x));
+ Node *add2 = phase->transform(new ConvL2INode(y));
+ return new AddINode(add1,add2);
}
// Disable optimization: LoadL->ConvL2I ==> LoadI.
--- a/hotspot/src/share/vm/opto/divnode.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/divnode.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -106,7 +106,7 @@
// division by +/- 1
if (!d_pos) {
// Just negate the value
- q = new (phase->C) SubINode(phase->intcon(0), dividend);
+ q = new SubINode(phase->intcon(0), dividend);
}
} else if ( is_power_of_2(d) ) {
// division by +/- a power of 2
@@ -143,18 +143,18 @@
// (-2+3)>>2 becomes 0, etc.
// Compute 0 or -1, based on sign bit
- Node *sign = phase->transform(new (phase->C) RShiftINode(dividend, phase->intcon(N - 1)));
+ Node *sign = phase->transform(new RShiftINode(dividend, phase->intcon(N - 1)));
// Mask sign bit to the low sign bits
- Node *round = phase->transform(new (phase->C) URShiftINode(sign, phase->intcon(N - l)));
+ Node *round = phase->transform(new URShiftINode(sign, phase->intcon(N - l)));
// Round up before shifting
- dividend = phase->transform(new (phase->C) AddINode(dividend, round));
+ dividend = phase->transform(new AddINode(dividend, round));
}
// Shift for division
- q = new (phase->C) RShiftINode(dividend, phase->intcon(l));
+ q = new RShiftINode(dividend, phase->intcon(l));
if (!d_pos) {
- q = new (phase->C) SubINode(phase->intcon(0), phase->transform(q));
+ q = new SubINode(phase->intcon(0), phase->transform(q));
}
} else {
// Attempt the jint constant divide -> multiply transform found in
@@ -166,33 +166,33 @@
jint shift_const;
if (magic_int_divide_constants(d, magic_const, shift_const)) {
Node *magic = phase->longcon(magic_const);
- Node *dividend_long = phase->transform(new (phase->C) ConvI2LNode(dividend));
+ Node *dividend_long = phase->transform(new ConvI2LNode(dividend));
// Compute the high half of the dividend x magic multiplication
- Node *mul_hi = phase->transform(new (phase->C) MulLNode(dividend_long, magic));
+ Node *mul_hi = phase->transform(new MulLNode(dividend_long, magic));
if (magic_const < 0) {
- mul_hi = phase->transform(new (phase->C) RShiftLNode(mul_hi, phase->intcon(N)));
- mul_hi = phase->transform(new (phase->C) ConvL2INode(mul_hi));
+ mul_hi = phase->transform(new RShiftLNode(mul_hi, phase->intcon(N)));
+ mul_hi = phase->transform(new ConvL2INode(mul_hi));
// The magic multiplier is too large for a 32 bit constant. We've adjusted
// it down by 2^32, but have to add 1 dividend back in after the multiplication.
// This handles the "overflow" case described by Granlund and Montgomery.
- mul_hi = phase->transform(new (phase->C) AddINode(dividend, mul_hi));
+ mul_hi = phase->transform(new AddINode(dividend, mul_hi));
// Shift over the (adjusted) mulhi
if (shift_const != 0) {
- mul_hi = phase->transform(new (phase->C) RShiftINode(mul_hi, phase->intcon(shift_const)));
+ mul_hi = phase->transform(new RShiftINode(mul_hi, phase->intcon(shift_const)));
}
} else {
// No add is required, we can merge the shifts together.
- mul_hi = phase->transform(new (phase->C) RShiftLNode(mul_hi, phase->intcon(N + shift_const)));
- mul_hi = phase->transform(new (phase->C) ConvL2INode(mul_hi));
+ mul_hi = phase->transform(new RShiftLNode(mul_hi, phase->intcon(N + shift_const)));
+ mul_hi = phase->transform(new ConvL2INode(mul_hi));
}
// Get a 0 or -1 from the sign of the dividend.
Node *addend0 = mul_hi;
- Node *addend1 = phase->transform(new (phase->C) RShiftINode(dividend, phase->intcon(N-1)));
+ Node *addend1 = phase->transform(new RShiftINode(dividend, phase->intcon(N-1)));
// If the divisor is negative, swap the order of the input addends;
// this has the effect of negating the quotient.
@@ -202,7 +202,7 @@
// Adjust the final quotient by subtracting -1 (adding 1)
// from the mul_hi.
- q = new (phase->C) SubINode(addend0, addend1);
+ q = new SubINode(addend0, addend1);
}
}
@@ -261,7 +261,7 @@
// no need to synthesize it in ideal nodes.
if (Matcher::has_match_rule(Op_MulHiL)) {
Node* v = phase->longcon(magic_const);
- return new (phase->C) MulHiLNode(dividend, v);
+ return new MulHiLNode(dividend, v);
}
// Taken from Hacker's Delight, Fig. 8-2. Multiply high signed.
@@ -287,11 +287,11 @@
const int N = 64;
// Dummy node to keep intermediate nodes alive during construction
- Node* hook = new (phase->C) Node(4);
+ Node* hook = new Node(4);
// u0 = u & 0xFFFFFFFF; u1 = u >> 32;
- Node* u0 = phase->transform(new (phase->C) AndLNode(dividend, phase->longcon(0xFFFFFFFF)));
- Node* u1 = phase->transform(new (phase->C) RShiftLNode(dividend, phase->intcon(N / 2)));
+ Node* u0 = phase->transform(new AndLNode(dividend, phase->longcon(0xFFFFFFFF)));
+ Node* u1 = phase->transform(new RShiftLNode(dividend, phase->intcon(N / 2)));
hook->init_req(0, u0);
hook->init_req(1, u1);
@@ -300,29 +300,29 @@
Node* v1 = phase->longcon(magic_const >> (N / 2));
// w0 = u0*v0;
- Node* w0 = phase->transform(new (phase->C) MulLNode(u0, v0));
+ Node* w0 = phase->transform(new MulLNode(u0, v0));
// t = u1*v0 + (w0 >> 32);
- Node* u1v0 = phase->transform(new (phase->C) MulLNode(u1, v0));
- Node* temp = phase->transform(new (phase->C) URShiftLNode(w0, phase->intcon(N / 2)));
- Node* t = phase->transform(new (phase->C) AddLNode(u1v0, temp));
+ Node* u1v0 = phase->transform(new MulLNode(u1, v0));
+ Node* temp = phase->transform(new URShiftLNode(w0, phase->intcon(N / 2)));
+ Node* t = phase->transform(new AddLNode(u1v0, temp));
hook->init_req(2, t);
// w1 = t & 0xFFFFFFFF;
- Node* w1 = phase->transform(new (phase->C) AndLNode(t, phase->longcon(0xFFFFFFFF)));
+ Node* w1 = phase->transform(new AndLNode(t, phase->longcon(0xFFFFFFFF)));
hook->init_req(3, w1);
// w2 = t >> 32;
- Node* w2 = phase->transform(new (phase->C) RShiftLNode(t, phase->intcon(N / 2)));
+ Node* w2 = phase->transform(new RShiftLNode(t, phase->intcon(N / 2)));
// w1 = u0*v1 + w1;
- Node* u0v1 = phase->transform(new (phase->C) MulLNode(u0, v1));
- w1 = phase->transform(new (phase->C) AddLNode(u0v1, w1));
+ Node* u0v1 = phase->transform(new MulLNode(u0, v1));
+ w1 = phase->transform(new AddLNode(u0v1, w1));
// return u1*v1 + w2 + (w1 >> 32);
- Node* u1v1 = phase->transform(new (phase->C) MulLNode(u1, v1));
- Node* temp1 = phase->transform(new (phase->C) AddLNode(u1v1, w2));
- Node* temp2 = phase->transform(new (phase->C) RShiftLNode(w1, phase->intcon(N / 2)));
+ Node* u1v1 = phase->transform(new MulLNode(u1, v1));
+ Node* temp1 = phase->transform(new AddLNode(u1v1, w2));
+ Node* temp2 = phase->transform(new RShiftLNode(w1, phase->intcon(N / 2)));
// Remove the bogus extra edges used to keep things alive
PhaseIterGVN* igvn = phase->is_IterGVN();
@@ -334,7 +334,7 @@
}
}
- return new (phase->C) AddLNode(temp1, temp2);
+ return new AddLNode(temp1, temp2);
}
@@ -357,7 +357,7 @@
// division by +/- 1
if (!d_pos) {
// Just negate the value
- q = new (phase->C) SubLNode(phase->longcon(0), dividend);
+ q = new SubLNode(phase->longcon(0), dividend);
}
} else if ( is_power_of_2_long(d) ) {
@@ -396,18 +396,18 @@
// (-2+3)>>2 becomes 0, etc.
// Compute 0 or -1, based on sign bit
- Node *sign = phase->transform(new (phase->C) RShiftLNode(dividend, phase->intcon(N - 1)));
+ Node *sign = phase->transform(new RShiftLNode(dividend, phase->intcon(N - 1)));
// Mask sign bit to the low sign bits
- Node *round = phase->transform(new (phase->C) URShiftLNode(sign, phase->intcon(N - l)));
+ Node *round = phase->transform(new URShiftLNode(sign, phase->intcon(N - l)));
// Round up before shifting
- dividend = phase->transform(new (phase->C) AddLNode(dividend, round));
+ dividend = phase->transform(new AddLNode(dividend, round));
}
// Shift for division
- q = new (phase->C) RShiftLNode(dividend, phase->intcon(l));
+ q = new RShiftLNode(dividend, phase->intcon(l));
if (!d_pos) {
- q = new (phase->C) SubLNode(phase->longcon(0), phase->transform(q));
+ q = new SubLNode(phase->longcon(0), phase->transform(q));
}
} else if ( !Matcher::use_asm_for_ldiv_by_con(d) ) { // Use hardware DIV instruction when
// it is faster than code generated below.
@@ -427,17 +427,17 @@
// The magic multiplier is too large for a 64 bit constant. We've adjusted
// it down by 2^64, but have to add 1 dividend back in after the multiplication.
// This handles the "overflow" case described by Granlund and Montgomery.
- mul_hi = phase->transform(new (phase->C) AddLNode(dividend, mul_hi));
+ mul_hi = phase->transform(new AddLNode(dividend, mul_hi));
}
// Shift over the (adjusted) mulhi
if (shift_const != 0) {
- mul_hi = phase->transform(new (phase->C) RShiftLNode(mul_hi, phase->intcon(shift_const)));
+ mul_hi = phase->transform(new RShiftLNode(mul_hi, phase->intcon(shift_const)));
}
// Get a 0 or -1 from the sign of the dividend.
Node *addend0 = mul_hi;
- Node *addend1 = phase->transform(new (phase->C) RShiftLNode(dividend, phase->intcon(N-1)));
+ Node *addend1 = phase->transform(new RShiftLNode(dividend, phase->intcon(N-1)));
// If the divisor is negative, swap the order of the input addends;
// this has the effect of negating the quotient.
@@ -447,7 +447,7 @@
// Adjust the final quotient by subtracting -1 (adding 1)
// from the mul_hi.
- q = new (phase->C) SubLNode(addend0, addend1);
+ q = new SubLNode(addend0, addend1);
}
}
@@ -737,7 +737,7 @@
assert( frexp((double)reciprocal, &exp) == 0.5, "reciprocal should be power of 2" );
// return multiplication by the reciprocal
- return (new (phase->C) MulFNode(in(1), phase->makecon(TypeF::make(reciprocal))));
+ return (new MulFNode(in(1), phase->makecon(TypeF::make(reciprocal))));
}
//=============================================================================
@@ -831,7 +831,7 @@
assert( frexp(reciprocal, &exp) == 0.5, "reciprocal should be power of 2" );
// return multiplication by the reciprocal
- return (new (phase->C) MulDNode(in(1), phase->makecon(TypeD::make(reciprocal))));
+ return (new MulDNode(in(1), phase->makecon(TypeD::make(reciprocal))));
}
//=============================================================================
@@ -858,7 +858,7 @@
if( !ti->is_con() ) return NULL;
jint con = ti->get_con();
- Node *hook = new (phase->C) Node(1);
+ Node *hook = new Node(1);
// First, special check for modulo 2^k-1
if( con >= 0 && con < max_jint && is_power_of_2(con+1) ) {
@@ -878,24 +878,24 @@
hook->init_req(0, x); // Add a use to x to prevent him from dying
// Generate code to reduce X rapidly to nearly 2^k-1.
for( int i = 0; i < trip_count; i++ ) {
- Node *xl = phase->transform( new (phase->C) AndINode(x,divisor) );
- Node *xh = phase->transform( new (phase->C) RShiftINode(x,phase->intcon(k)) ); // Must be signed
- x = phase->transform( new (phase->C) AddINode(xh,xl) );
+ Node *xl = phase->transform( new AndINode(x,divisor) );
+ Node *xh = phase->transform( new RShiftINode(x,phase->intcon(k)) ); // Must be signed
+ x = phase->transform( new AddINode(xh,xl) );
hook->set_req(0, x);
}
// Generate sign-fixup code. Was original value positive?
// int hack_res = (i >= 0) ? divisor : 1;
- Node *cmp1 = phase->transform( new (phase->C) CmpINode( in(1), phase->intcon(0) ) );
- Node *bol1 = phase->transform( new (phase->C) BoolNode( cmp1, BoolTest::ge ) );
- Node *cmov1= phase->transform( new (phase->C) CMoveINode(bol1, phase->intcon(1), divisor, TypeInt::POS) );
+ Node *cmp1 = phase->transform( new CmpINode( in(1), phase->intcon(0) ) );
+ Node *bol1 = phase->transform( new BoolNode( cmp1, BoolTest::ge ) );
+ Node *cmov1= phase->transform( new CMoveINode(bol1, phase->intcon(1), divisor, TypeInt::POS) );
// if( x >= hack_res ) x -= divisor;
- Node *sub = phase->transform( new (phase->C) SubINode( x, divisor ) );
- Node *cmp2 = phase->transform( new (phase->C) CmpINode( x, cmov1 ) );
- Node *bol2 = phase->transform( new (phase->C) BoolNode( cmp2, BoolTest::ge ) );
+ Node *sub = phase->transform( new SubINode( x, divisor ) );
+ Node *cmp2 = phase->transform( new CmpINode( x, cmov1 ) );
+ Node *bol2 = phase->transform( new BoolNode( cmp2, BoolTest::ge ) );
// Convention is to not transform the return value of an Ideal
// since Ideal is expected to return a modified 'this' or a new node.
- Node *cmov2= new (phase->C) CMoveINode(bol2, x, sub, TypeInt::INT);
+ Node *cmov2= new CMoveINode(bol2, x, sub, TypeInt::INT);
// cmov2 is now the mod
// Now remove the bogus extra edges used to keep things alive
@@ -918,7 +918,7 @@
jint pos_con = (con >= 0) ? con : -con;
// integer Mod 1 is always 0
- if( pos_con == 1 ) return new (phase->C) ConINode(TypeInt::ZERO);
+ if( pos_con == 1 ) return new ConINode(TypeInt::ZERO);
int log2_con = -1;
@@ -931,7 +931,7 @@
// See if this can be masked, if the dividend is non-negative
if( dti && dti->_lo >= 0 )
- return ( new (phase->C) AndINode( in(1), phase->intcon( pos_con-1 ) ) );
+ return ( new AndINode( in(1), phase->intcon( pos_con-1 ) ) );
}
// Save in(1) so that it cannot be changed or deleted
@@ -946,12 +946,12 @@
Node *mult = NULL;
if( log2_con >= 0 )
- mult = phase->transform( new (phase->C) LShiftINode( divide, phase->intcon( log2_con ) ) );
+ mult = phase->transform( new LShiftINode( divide, phase->intcon( log2_con ) ) );
else
- mult = phase->transform( new (phase->C) MulINode( divide, phase->intcon( pos_con ) ) );
+ mult = phase->transform( new MulINode( divide, phase->intcon( pos_con ) ) );
// Finally, subtract the multiplied divided value from the original
- result = new (phase->C) SubINode( in(1), mult );
+ result = new SubINode( in(1), mult );
}
// Now remove the bogus extra edges used to keep things alive
@@ -1029,7 +1029,7 @@
if( !tl->is_con() ) return NULL;
jlong con = tl->get_con();
- Node *hook = new (phase->C) Node(1);
+ Node *hook = new Node(1);
// Expand mod
if( con >= 0 && con < max_jlong && is_power_of_2_long(con+1) ) {
@@ -1051,24 +1051,24 @@
hook->init_req(0, x); // Add a use to x to prevent him from dying
// Generate code to reduce X rapidly to nearly 2^k-1.
for( int i = 0; i < trip_count; i++ ) {
- Node *xl = phase->transform( new (phase->C) AndLNode(x,divisor) );
- Node *xh = phase->transform( new (phase->C) RShiftLNode(x,phase->intcon(k)) ); // Must be signed
- x = phase->transform( new (phase->C) AddLNode(xh,xl) );
+ Node *xl = phase->transform( new AndLNode(x,divisor) );
+ Node *xh = phase->transform( new RShiftLNode(x,phase->intcon(k)) ); // Must be signed
+ x = phase->transform( new AddLNode(xh,xl) );
hook->set_req(0, x); // Add a use to x to prevent him from dying
}
// Generate sign-fixup code. Was original value positive?
// long hack_res = (i >= 0) ? divisor : CONST64(1);
- Node *cmp1 = phase->transform( new (phase->C) CmpLNode( in(1), phase->longcon(0) ) );
- Node *bol1 = phase->transform( new (phase->C) BoolNode( cmp1, BoolTest::ge ) );
- Node *cmov1= phase->transform( new (phase->C) CMoveLNode(bol1, phase->longcon(1), divisor, TypeLong::LONG) );
+ Node *cmp1 = phase->transform( new CmpLNode( in(1), phase->longcon(0) ) );
+ Node *bol1 = phase->transform( new BoolNode( cmp1, BoolTest::ge ) );
+ Node *cmov1= phase->transform( new CMoveLNode(bol1, phase->longcon(1), divisor, TypeLong::LONG) );
// if( x >= hack_res ) x -= divisor;
- Node *sub = phase->transform( new (phase->C) SubLNode( x, divisor ) );
- Node *cmp2 = phase->transform( new (phase->C) CmpLNode( x, cmov1 ) );
- Node *bol2 = phase->transform( new (phase->C) BoolNode( cmp2, BoolTest::ge ) );
+ Node *sub = phase->transform( new SubLNode( x, divisor ) );
+ Node *cmp2 = phase->transform( new CmpLNode( x, cmov1 ) );
+ Node *bol2 = phase->transform( new BoolNode( cmp2, BoolTest::ge ) );
// Convention is to not transform the return value of an Ideal
// since Ideal is expected to return a modified 'this' or a new node.
- Node *cmov2= new (phase->C) CMoveLNode(bol2, x, sub, TypeLong::LONG);
+ Node *cmov2= new CMoveLNode(bol2, x, sub, TypeLong::LONG);
// cmov2 is now the mod
// Now remove the bogus extra edges used to keep things alive
@@ -1091,7 +1091,7 @@
jlong pos_con = (con >= 0) ? con : -con;
// integer Mod 1 is always 0
- if( pos_con == 1 ) return new (phase->C) ConLNode(TypeLong::ZERO);
+ if( pos_con == 1 ) return new ConLNode(TypeLong::ZERO);
int log2_con = -1;
@@ -1104,7 +1104,7 @@
// See if this can be masked, if the dividend is non-negative
if( dtl && dtl->_lo >= 0 )
- return ( new (phase->C) AndLNode( in(1), phase->longcon( pos_con-1 ) ) );
+ return ( new AndLNode( in(1), phase->longcon( pos_con-1 ) ) );
}
// Save in(1) so that it cannot be changed or deleted
@@ -1119,12 +1119,12 @@
Node *mult = NULL;
if( log2_con >= 0 )
- mult = phase->transform( new (phase->C) LShiftLNode( divide, phase->intcon( log2_con ) ) );
+ mult = phase->transform( new LShiftLNode( divide, phase->intcon( log2_con ) ) );
else
- mult = phase->transform( new (phase->C) MulLNode( divide, phase->longcon( pos_con ) ) );
+ mult = phase->transform( new MulLNode( divide, phase->longcon( pos_con ) ) );
// Finally, subtract the multiplied divided value from the original
- result = new (phase->C) SubLNode( in(1), mult );
+ result = new SubLNode( in(1), mult );
}
// Now remove the bogus extra edges used to keep things alive
@@ -1279,9 +1279,9 @@
assert(n->Opcode() == Op_DivI || n->Opcode() == Op_ModI,
"only div or mod input pattern accepted");
- DivModINode* divmod = new (C) DivModINode(n->in(0), n->in(1), n->in(2));
- Node* dproj = new (C) ProjNode(divmod, DivModNode::div_proj_num);
- Node* mproj = new (C) ProjNode(divmod, DivModNode::mod_proj_num);
+ DivModINode* divmod = new DivModINode(n->in(0), n->in(1), n->in(2));
+ Node* dproj = new ProjNode(divmod, DivModNode::div_proj_num);
+ Node* mproj = new ProjNode(divmod, DivModNode::mod_proj_num);
return divmod;
}
@@ -1291,9 +1291,9 @@
assert(n->Opcode() == Op_DivL || n->Opcode() == Op_ModL,
"only div or mod input pattern accepted");
- DivModLNode* divmod = new (C) DivModLNode(n->in(0), n->in(1), n->in(2));
- Node* dproj = new (C) ProjNode(divmod, DivModNode::div_proj_num);
- Node* mproj = new (C) ProjNode(divmod, DivModNode::mod_proj_num);
+ DivModLNode* divmod = new DivModLNode(n->in(0), n->in(1), n->in(2));
+ Node* dproj = new ProjNode(divmod, DivModNode::div_proj_num);
+ Node* mproj = new ProjNode(divmod, DivModNode::mod_proj_num);
return divmod;
}
@@ -1308,7 +1308,7 @@
assert(proj->_con == mod_proj_num, "must be div or mod projection");
rm = match->modI_proj_mask();
}
- return new (match->C)MachProjNode(this, proj->_con, rm, ideal_reg);
+ return new MachProjNode(this, proj->_con, rm, ideal_reg);
}
@@ -1323,5 +1323,5 @@
assert(proj->_con == mod_proj_num, "must be div or mod projection");
rm = match->modL_proj_mask();
}
- return new (match->C)MachProjNode(this, proj->_con, rm, ideal_reg);
+ return new MachProjNode(this, proj->_con, rm, ideal_reg);
}
--- a/hotspot/src/share/vm/opto/doCall.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/doCall.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -119,12 +119,12 @@
if (allow_inline && allow_intrinsics) {
CallGenerator* cg = find_intrinsic(callee, call_does_dispatch);
if (cg != NULL) {
- if (cg->is_predicted()) {
+ if (cg->is_predicated()) {
// Code without intrinsic but, hopefully, inlined.
CallGenerator* inline_cg = this->call_generator(callee,
vtable_index, call_does_dispatch, jvms, allow_inline, prof_factor, speculative_receiver_type, false);
if (inline_cg != NULL) {
- cg = CallGenerator::for_predicted_intrinsic(cg, inline_cg);
+ cg = CallGenerator::for_predicated_intrinsic(cg, inline_cg);
}
}
@@ -525,7 +525,7 @@
// because exceptions don't return to the call site.)
profile_call(receiver);
- JVMState* new_jvms = cg->generate(jvms, this);
+ JVMState* new_jvms = cg->generate(jvms);
if (new_jvms == NULL) {
// When inlining attempt fails (e.g., too many arguments),
// it may contaminate the current compile state, making it
@@ -539,7 +539,7 @@
// intrinsic was expecting to optimize. Should always be possible to
// get a normal java call that may inline in that case
cg = C->call_generator(cg->method(), vtable_index, call_does_dispatch, jvms, try_inline, prof_factor(), speculative_receiver_type, /* allow_intrinsics= */ false);
- new_jvms = cg->generate(jvms, this);
+ new_jvms = cg->generate(jvms);
if (new_jvms == NULL) {
guarantee(failing(), "call failed to generate: calls should work");
return;
@@ -596,7 +596,7 @@
const Type* sig_type = TypeOopPtr::make_from_klass(ctype->as_klass());
if (arg_type != NULL && !arg_type->higher_equal(sig_type)) {
Node* retnode = pop();
- Node* cast_obj = _gvn.transform(new (C) CheckCastPPNode(control(), retnode, sig_type));
+ Node* cast_obj = _gvn.transform(new CheckCastPPNode(control(), retnode, sig_type));
push(cast_obj);
}
}
@@ -689,7 +689,7 @@
}
int len = bcis->length();
- CatchNode *cn = new (C) CatchNode(control(), i_o, len+1);
+ CatchNode *cn = new CatchNode(control(), i_o, len+1);
Node *catch_ = _gvn.transform(cn);
// now branch with the exception state to each of the (potential)
@@ -700,14 +700,14 @@
// Locals are just copied from before the call.
// Get control from the CatchNode.
int handler_bci = bcis->at(i);
- Node* ctrl = _gvn.transform( new (C) CatchProjNode(catch_, i+1,handler_bci));
+ Node* ctrl = _gvn.transform( new CatchProjNode(catch_, i+1,handler_bci));
// This handler cannot happen?
if (ctrl == top()) continue;
set_control(ctrl);
// Create exception oop
const TypeInstPtr* extype = extypes->at(i)->is_instptr();
- Node *ex_oop = _gvn.transform(new (C) CreateExNode(extypes->at(i), ctrl, i_o));
+ Node *ex_oop = _gvn.transform(new CreateExNode(extypes->at(i), ctrl, i_o));
// Handle unloaded exception classes.
if (saw_unloaded->contains(handler_bci)) {
@@ -746,7 +746,7 @@
// The first CatchProj is for the normal return.
// (Note: If this is a call to rethrow_Java, this node goes dead.)
- set_control(_gvn.transform( new (C) CatchProjNode(catch_, CatchProjNode::fall_through_index, CatchProjNode::no_handler_bci)));
+ set_control(_gvn.transform( new CatchProjNode(catch_, CatchProjNode::fall_through_index, CatchProjNode::no_handler_bci)));
}
@@ -797,7 +797,7 @@
// I'm loading the class from, I can replace the LoadKlass with the
// klass constant for the exception oop.
if( ex_node->is_Phi() ) {
- ex_klass_node = new (C) PhiNode( ex_node->in(0), TypeKlassPtr::OBJECT );
+ ex_klass_node = new PhiNode( ex_node->in(0), TypeKlassPtr::OBJECT );
for( uint i = 1; i < ex_node->req(); i++ ) {
Node* p = basic_plus_adr( ex_node->in(i), ex_node->in(i), oopDesc::klass_offset_in_bytes() );
Node* k = _gvn.transform( LoadKlassNode::make(_gvn, immutable_memory(), p, TypeInstPtr::KLASS, TypeKlassPtr::OBJECT) );
@@ -863,7 +863,7 @@
PreserveJVMState pjvms(this);
const TypeInstPtr* tinst = TypeOopPtr::make_from_klass_unique(klass)->cast_to_ptr_type(TypePtr::NotNull)->is_instptr();
assert(klass->has_subklass() || tinst->klass_is_exact(), "lost exactness");
- Node* ex_oop = _gvn.transform(new (C) CheckCastPPNode(control(), ex_node, tinst));
+ Node* ex_oop = _gvn.transform(new CheckCastPPNode(control(), ex_node, tinst));
push_ex_oop(ex_oop); // Push exception oop for handler
#ifndef PRODUCT
if (PrintOpto && WizardMode) {
--- a/hotspot/src/share/vm/opto/escape.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/escape.cpp Wed Jul 05 19:46:31 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
@@ -939,7 +939,13 @@
strcmp(call->as_CallLeaf()->_name, "aescrypt_encryptBlock") == 0 ||
strcmp(call->as_CallLeaf()->_name, "aescrypt_decryptBlock") == 0 ||
strcmp(call->as_CallLeaf()->_name, "cipherBlockChaining_encryptAESCrypt") == 0 ||
- strcmp(call->as_CallLeaf()->_name, "cipherBlockChaining_decryptAESCrypt") == 0)
+ strcmp(call->as_CallLeaf()->_name, "cipherBlockChaining_decryptAESCrypt") == 0 ||
+ strcmp(call->as_CallLeaf()->_name, "sha1_implCompress") == 0 ||
+ strcmp(call->as_CallLeaf()->_name, "sha1_implCompressMB") == 0 ||
+ strcmp(call->as_CallLeaf()->_name, "sha256_implCompress") == 0 ||
+ strcmp(call->as_CallLeaf()->_name, "sha256_implCompressMB") == 0 ||
+ strcmp(call->as_CallLeaf()->_name, "sha512_implCompress") == 0 ||
+ strcmp(call->as_CallLeaf()->_name, "sha512_implCompressMB") == 0)
))) {
call->dump();
fatal(err_msg_res("EA unexpected CallLeaf %s", call->as_CallLeaf()->_name));
--- a/hotspot/src/share/vm/opto/generateOptoStub.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/generateOptoStub.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -50,7 +50,7 @@
const TypeTuple *jrange = C->tf()->range();
// The procedure start
- StartNode* start = new (C) StartNode(root(), jdomain);
+ StartNode* start = new StartNode(root(), jdomain);
_gvn.set_type_bottom(start);
// Make a map, with JVM state
@@ -64,7 +64,7 @@
jvms->set_scloff(max_map);
jvms->set_endoff(max_map);
{
- SafePointNode *map = new (C) SafePointNode( max_map, jvms );
+ SafePointNode *map = new SafePointNode( max_map, jvms );
jvms->set_map(map);
set_jvms(jvms);
assert(map == this->map(), "kit.map is set");
@@ -73,7 +73,7 @@
// Make up the parameters
uint i;
for( i = 0; i < parm_cnt; i++ )
- map()->init_req(i, _gvn.transform(new (C) ParmNode(start, i)));
+ map()->init_req(i, _gvn.transform(new ParmNode(start, i)));
for( ; i<map()->req(); i++ )
map()->init_req(i, top()); // For nicer debugging
@@ -81,7 +81,7 @@
set_all_memory(map()->memory());
// Get base of thread-local storage area
- Node* thread = _gvn.transform( new (C) ThreadLocalNode() );
+ Node* thread = _gvn.transform( new ThreadLocalNode() );
const int NoAlias = Compile::AliasIdxBot;
@@ -166,8 +166,7 @@
//-----------------------------
// Make the call node
- CallRuntimeNode *call = new (C)
- CallRuntimeNode(c_sig, C_function, name, TypePtr::BOTTOM);
+ CallRuntimeNode *call = new CallRuntimeNode(c_sig, C_function, name, TypePtr::BOTTOM);
//-----------------------------
// Fix-up the debug info for the call
@@ -184,7 +183,7 @@
for (; i < parm_cnt; i++) { // Regular input arguments
// Convert ints to longs if required.
if (CCallingConventionRequiresIntsAsLongs && jdomain->field_at(i)->isa_int()) {
- Node* int_as_long = _gvn.transform(new (C) ConvI2LNode(map()->in(i)));
+ Node* int_as_long = _gvn.transform(new ConvI2LNode(map()->in(i)));
call->init_req(cnt++, int_as_long); // long
call->init_req(cnt++, top()); // half
} else {
@@ -200,23 +199,23 @@
//-----------------------------
// Now set up the return results
- set_control( _gvn.transform( new (C) ProjNode(call,TypeFunc::Control)) );
- set_i_o( _gvn.transform( new (C) ProjNode(call,TypeFunc::I_O )) );
+ set_control( _gvn.transform( new ProjNode(call,TypeFunc::Control)) );
+ set_i_o( _gvn.transform( new ProjNode(call,TypeFunc::I_O )) );
set_all_memory_call(call);
if (range->cnt() > TypeFunc::Parms) {
- Node* retnode = _gvn.transform( new (C) ProjNode(call,TypeFunc::Parms) );
+ Node* retnode = _gvn.transform( new ProjNode(call,TypeFunc::Parms) );
// C-land is allowed to return sub-word values. Convert to integer type.
assert( retval != Type::TOP, "" );
if (retval == TypeInt::BOOL) {
- retnode = _gvn.transform( new (C) AndINode(retnode, intcon(0xFF)) );
+ retnode = _gvn.transform( new AndINode(retnode, intcon(0xFF)) );
} else if (retval == TypeInt::CHAR) {
- retnode = _gvn.transform( new (C) AndINode(retnode, intcon(0xFFFF)) );
+ retnode = _gvn.transform( new AndINode(retnode, intcon(0xFFFF)) );
} else if (retval == TypeInt::BYTE) {
- retnode = _gvn.transform( new (C) LShiftINode(retnode, intcon(24)) );
- retnode = _gvn.transform( new (C) RShiftINode(retnode, intcon(24)) );
+ retnode = _gvn.transform( new LShiftINode(retnode, intcon(24)) );
+ retnode = _gvn.transform( new RShiftINode(retnode, intcon(24)) );
} else if (retval == TypeInt::SHORT) {
- retnode = _gvn.transform( new (C) LShiftINode(retnode, intcon(16)) );
- retnode = _gvn.transform( new (C) RShiftINode(retnode, intcon(16)) );
+ retnode = _gvn.transform( new LShiftINode(retnode, intcon(16)) );
+ retnode = _gvn.transform( new RShiftINode(retnode, intcon(16)) );
}
map()->set_req( TypeFunc::Parms, retnode );
}
@@ -253,21 +252,21 @@
Node* exit_memory = reset_memory();
- Node* cmp = _gvn.transform( new (C) CmpPNode(pending, null()) );
- Node* bo = _gvn.transform( new (C) BoolNode(cmp, BoolTest::ne) );
+ Node* cmp = _gvn.transform( new CmpPNode(pending, null()) );
+ Node* bo = _gvn.transform( new BoolNode(cmp, BoolTest::ne) );
IfNode *iff = create_and_map_if(control(), bo, PROB_MIN, COUNT_UNKNOWN);
- Node* if_null = _gvn.transform( new (C) IfFalseNode(iff) );
- Node* if_not_null = _gvn.transform( new (C) IfTrueNode(iff) );
+ Node* if_null = _gvn.transform( new IfFalseNode(iff) );
+ Node* if_not_null = _gvn.transform( new IfTrueNode(iff) );
assert (StubRoutines::forward_exception_entry() != NULL, "must be generated before");
Node *exc_target = makecon(TypeRawPtr::make( StubRoutines::forward_exception_entry() ));
- Node *to_exc = new (C) TailCallNode(if_not_null,
- i_o(),
- exit_memory,
- frameptr(),
- returnadr(),
- exc_target, null());
+ Node *to_exc = new TailCallNode(if_not_null,
+ i_o(),
+ exit_memory,
+ frameptr(),
+ returnadr(),
+ exc_target, null());
root()->add_req(_gvn.transform(to_exc)); // bind to root to keep live
C->init_start(start);
@@ -277,27 +276,27 @@
switch( is_fancy_jump ) {
case 0: // Make a return instruction
// Return to caller, free any space for return address
- ret = new (C) ReturnNode(TypeFunc::Parms, if_null,
- i_o(),
- exit_memory,
- frameptr(),
- returnadr());
+ ret = new ReturnNode(TypeFunc::Parms, if_null,
+ i_o(),
+ exit_memory,
+ frameptr(),
+ returnadr());
if (C->tf()->range()->cnt() > TypeFunc::Parms)
ret->add_req( map()->in(TypeFunc::Parms) );
break;
case 1: // This is a fancy tail-call jump. Jump to computed address.
// Jump to new callee; leave old return address alone.
- ret = new (C) TailCallNode(if_null,
- i_o(),
- exit_memory,
- frameptr(),
- returnadr(),
- target, map()->in(TypeFunc::Parms));
+ ret = new TailCallNode(if_null,
+ i_o(),
+ exit_memory,
+ frameptr(),
+ returnadr(),
+ target, map()->in(TypeFunc::Parms));
break;
case 2: // Pop return address & jump
// Throw away old return address; jump to new computed address
//assert(C_function == CAST_FROM_FN_PTR(address, OptoRuntime::rethrow_C), "fancy_jump==2 only for rethrow");
- ret = new (C) TailJumpNode(if_null,
+ ret = new TailJumpNode(if_null,
i_o(),
exit_memory,
frameptr(),
--- a/hotspot/src/share/vm/opto/graphKit.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/graphKit.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -294,7 +294,7 @@
JVMState* jvms = new (C) JVMState(_method, NULL);
jvms->set_bci(_bci);
jvms->set_sp(_sp);
- jvms->set_map(new (C) SafePointNode(TypeFunc::Parms, jvms));
+ jvms->set_map(new SafePointNode(TypeFunc::Parms, jvms));
set_jvms(jvms);
for (uint i = 0; i < map()->req(); i++) map()->init_req(i, top());
set_all_memory(top());
@@ -347,7 +347,7 @@
if (region->in(0) != hidden_merge_mark) {
// The control input is not (yet) a specially-marked region in phi_map.
// Make it so, and build some phis.
- region = new (C) RegionNode(2);
+ region = new RegionNode(2);
_gvn.set_type(region, Type::CONTROL);
region->set_req(0, hidden_merge_mark); // marks an internal ex-state
region->init_req(1, phi_map->control());
@@ -432,6 +432,7 @@
}
}
}
+ phi_map->merge_replaced_nodes_with(ex_map);
}
//--------------------------use_exception_state--------------------------------
@@ -496,13 +497,13 @@
// take the uncommon_trap in the BuildCutout below.
// first must access the should_post_on_exceptions_flag in this thread's JavaThread
- Node* jthread = _gvn.transform(new (C) ThreadLocalNode());
+ Node* jthread = _gvn.transform(new ThreadLocalNode());
Node* adr = basic_plus_adr(top(), jthread, in_bytes(JavaThread::should_post_on_exceptions_flag_offset()));
Node* should_post_flag = make_load(control(), adr, TypeInt::INT, T_INT, Compile::AliasIdxRaw, MemNode::unordered);
// Test the should_post_on_exceptions_flag vs. 0
- Node* chk = _gvn.transform( new (C) CmpINode(should_post_flag, intcon(0)) );
- Node* tst = _gvn.transform( new (C) BoolNode(chk, BoolTest::eq) );
+ Node* chk = _gvn.transform( new CmpINode(should_post_flag, intcon(0)) );
+ Node* tst = _gvn.transform( new BoolNode(chk, BoolTest::eq) );
// Branch to slow_path if should_post_on_exceptions_flag was true
{ BuildCutout unless(this, tst, PROB_MAX);
@@ -645,7 +646,6 @@
_map = kit->map(); // preserve the map
_sp = kit->sp();
kit->set_map(clone_map ? kit->clone_map() : NULL);
- Compile::current()->inc_preserve_jvm_state();
#ifdef ASSERT
_bci = kit->bci();
Parse* parser = kit->is_Parse();
@@ -663,7 +663,6 @@
#endif
kit->set_map(_map);
kit->set_sp(_sp);
- Compile::current()->dec_preserve_jvm_state();
}
@@ -675,8 +674,8 @@
SafePointNode* outer_map = _map; // preserved map is caller's
SafePointNode* inner_map = kit->map();
IfNode* iff = kit->create_and_map_if(outer_map->control(), p, prob, cnt);
- outer_map->set_control(kit->gvn().transform( new (kit->C) IfTrueNode(iff) ));
- inner_map->set_control(kit->gvn().transform( new (kit->C) IfFalseNode(iff) ));
+ outer_map->set_control(kit->gvn().transform( new IfTrueNode(iff) ));
+ inner_map->set_control(kit->gvn().transform( new IfFalseNode(iff) ));
}
BuildCutout::~BuildCutout() {
GraphKit* kit = _kit;
@@ -1118,7 +1117,7 @@
Node* GraphKit::basic_plus_adr(Node* base, Node* ptr, Node* offset) {
// short-circuit a common case
if (offset == intcon(0)) return ptr;
- return _gvn.transform( new (C) AddPNode(base, ptr, offset) );
+ return _gvn.transform( new AddPNode(base, ptr, offset) );
}
Node* GraphKit::ConvI2L(Node* offset) {
@@ -1127,7 +1126,7 @@
if (offset_con != Type::OffsetBot) {
return longcon((jlong) offset_con);
}
- return _gvn.transform( new (C) ConvI2LNode(offset));
+ return _gvn.transform( new ConvI2LNode(offset));
}
Node* GraphKit::ConvI2UL(Node* offset) {
@@ -1135,9 +1134,9 @@
if (offset_con != (juint) Type::OffsetBot) {
return longcon((julong) offset_con);
}
- Node* conv = _gvn.transform( new (C) ConvI2LNode(offset));
+ Node* conv = _gvn.transform( new ConvI2LNode(offset));
Node* mask = _gvn.transform( ConLNode::make(C, (julong) max_juint) );
- return _gvn.transform( new (C) AndLNode(conv, mask) );
+ return _gvn.transform( new AndLNode(conv, mask) );
}
Node* GraphKit::ConvL2I(Node* offset) {
@@ -1146,7 +1145,7 @@
if (offset_con != (jlong)Type::OffsetBot) {
return intcon((int) offset_con);
}
- return _gvn.transform( new (C) ConvL2INode(offset));
+ return _gvn.transform( new ConvL2INode(offset));
}
//-------------------------load_object_klass-----------------------------------
@@ -1165,7 +1164,7 @@
Node *alen;
if (alloc == NULL) {
Node *r_adr = basic_plus_adr(array, arrayOopDesc::length_offset_in_bytes());
- alen = _gvn.transform( new (C) LoadRangeNode(0, immutable_memory(), r_adr, TypeInt::POS));
+ alen = _gvn.transform( new LoadRangeNode(0, immutable_memory(), r_adr, TypeInt::POS));
} else {
alen = alloc->Ideal_length();
Node* ccast = alloc->make_ideal_length(_gvn.type(array)->is_oopptr(), &_gvn);
@@ -1199,8 +1198,8 @@
// Construct NULL check
Node *chk = NULL;
switch(type) {
- case T_LONG : chk = new (C) CmpLNode(value, _gvn.zerocon(T_LONG)); break;
- case T_INT : chk = new (C) CmpINode(value, _gvn.intcon(0)); break;
+ case T_LONG : chk = new CmpLNode(value, _gvn.zerocon(T_LONG)); break;
+ case T_INT : chk = new CmpINode(value, _gvn.intcon(0)); break;
case T_ARRAY : // fall through
type = T_OBJECT; // simplify further tests
case T_OBJECT : {
@@ -1247,7 +1246,7 @@
return value; // Elided null check quickly!
}
}
- chk = new (C) CmpPNode( value, null() );
+ chk = new CmpPNode( value, null() );
break;
}
@@ -1258,7 +1257,7 @@
chk = _gvn.transform(chk);
BoolTest::mask btest = assert_null ? BoolTest::eq : BoolTest::ne;
- BoolNode *btst = new (C) BoolNode( chk, btest);
+ BoolNode *btst = new BoolNode( chk, btest);
Node *tst = _gvn.transform( btst );
//-----------
@@ -1325,8 +1324,8 @@
if (null_control != NULL) {
IfNode* iff = create_and_map_if(control(), tst, ok_prob, COUNT_UNKNOWN);
- Node* null_true = _gvn.transform( new (C) IfFalseNode(iff));
- set_control( _gvn.transform( new (C) IfTrueNode(iff)));
+ Node* null_true = _gvn.transform( new IfFalseNode(iff));
+ set_control( _gvn.transform( new IfTrueNode(iff)));
if (null_true == top())
explicit_null_checks_elided++;
(*null_control) = null_true;
@@ -1378,7 +1377,7 @@
// Object is already not-null?
if( t == t_not_null ) return obj;
- Node *cast = new (C) CastPPNode(obj,t_not_null);
+ Node *cast = new CastPPNode(obj,t_not_null);
cast->init_req(0, control());
cast = _gvn.transform( cast );
@@ -1403,60 +1402,17 @@
// on the map. This includes locals, stack, and monitors
// of the current (innermost) JVM state.
- if (!ReplaceInParentMaps) {
- return;
- }
-
- // PreserveJVMState doesn't do a deep copy so we can't modify
- // parents
- if (Compile::current()->has_preserve_jvm_state()) {
+ // don't let inconsistent types from profiling escape this
+ // method
+
+ const Type* told = _gvn.type(old);
+ const Type* tnew = _gvn.type(neww);
+
+ if (!tnew->higher_equal(told)) {
return;
}
- Parse* parser = is_Parse();
- bool progress = true;
- Node* ctrl = map()->in(0);
- // Follow the chain of parsers and see whether the update can be
- // done in the map of callers. We can do the replace for a caller if
- // the current control post dominates the control of a caller.
- while (parser != NULL && parser->caller() != NULL && progress) {
- progress = false;
- Node* parent_map = parser->caller()->map();
- assert(parser->exits().map()->jvms()->depth() == parser->caller()->depth(), "map mismatch");
-
- Node* parent_ctrl = parent_map->in(0);
-
- while (parent_ctrl->is_Region()) {
- Node* n = parent_ctrl->as_Region()->is_copy();
- if (n == NULL) {
- break;
- }
- parent_ctrl = n;
- }
-
- for (;;) {
- if (ctrl == parent_ctrl) {
- // update the map of the exits which is the one that will be
- // used when compilation resume after inlining
- parser->exits().map()->replace_edge(old, neww);
- progress = true;
- break;
- }
- if (ctrl->is_Proj() && ctrl->as_Proj()->is_uncommon_trap_if_pattern(Deoptimization::Reason_none)) {
- ctrl = ctrl->in(0)->in(0);
- } else if (ctrl->is_Region()) {
- Node* n = ctrl->as_Region()->is_copy();
- if (n == NULL) {
- break;
- }
- ctrl = n;
- } else {
- break;
- }
- }
-
- parser = parser->parent_parser();
- }
+ map()->record_replaced_node(old, neww);
}
@@ -1486,7 +1442,7 @@
//------------------------------set_all_memory_call----------------------------
void GraphKit::set_all_memory_call(Node* call, bool separate_io_proj) {
- Node* newmem = _gvn.transform( new (C) ProjNode(call, TypeFunc::Memory, separate_io_proj) );
+ Node* newmem = _gvn.transform( new ProjNode(call, TypeFunc::Memory, separate_io_proj) );
set_all_memory(newmem);
}
@@ -1721,9 +1677,9 @@
int index_max = max_jint - 1; // array size is max_jint, index is one less
if (sizetype != NULL) index_max = sizetype->_hi - 1;
const TypeLong* lidxtype = TypeLong::make(CONST64(0), index_max, Type::WidenMax);
- idx = _gvn.transform( new (C) ConvI2LNode(idx, lidxtype) );
+ idx = _gvn.transform( new ConvI2LNode(idx, lidxtype) );
#endif
- Node* scale = _gvn.transform( new (C) LShiftXNode(idx, intcon(shift)) );
+ Node* scale = _gvn.transform( new LShiftXNode(idx, intcon(shift)) );
return basic_plus_adr(ary, base, scale);
}
@@ -1771,8 +1727,8 @@
// Re-use the current map to produce the result.
- set_control(_gvn.transform(new (C) ProjNode(call, TypeFunc::Control)));
- set_i_o( _gvn.transform(new (C) ProjNode(call, TypeFunc::I_O , separate_io_proj)));
+ set_control(_gvn.transform(new ProjNode(call, TypeFunc::Control)));
+ set_i_o( _gvn.transform(new ProjNode(call, TypeFunc::I_O , separate_io_proj)));
set_all_memory_call(xcall, separate_io_proj);
//return xcall; // no need, caller already has it
@@ -1786,7 +1742,7 @@
if (call->method() == NULL ||
call->method()->return_type()->basic_type() == T_VOID)
ret = top();
- else ret = _gvn.transform(new (C) ProjNode(call, TypeFunc::Parms));
+ else ret = _gvn.transform(new ProjNode(call, TypeFunc::Parms));
// Note: Since any out-of-line call can produce an exception,
// we always insert an I_O projection from the call into the result.
@@ -1797,8 +1753,8 @@
// The caller requested separate projections be used by the fall
// through and exceptional paths, so replace the projections for
// the fall through path.
- set_i_o(_gvn.transform( new (C) ProjNode(call, TypeFunc::I_O) ));
- set_all_memory(_gvn.transform( new (C) ProjNode(call, TypeFunc::Memory) ));
+ set_i_o(_gvn.transform( new ProjNode(call, TypeFunc::I_O) ));
+ set_all_memory(_gvn.transform( new ProjNode(call, TypeFunc::Memory) ));
}
return ret;
}
@@ -1838,13 +1794,13 @@
Node* keep_mem,
const TypePtr* hook_mem) {
// no i/o
- set_control(_gvn.transform( new (C) ProjNode(call,TypeFunc::Control) ));
+ set_control(_gvn.transform( new ProjNode(call,TypeFunc::Control) ));
if (keep_mem) {
// First clone the existing memory state
set_all_memory(keep_mem);
if (hook_mem != NULL) {
// Make memory for the call
- Node* mem = _gvn.transform( new (C) ProjNode(call, TypeFunc::Memory) );
+ Node* mem = _gvn.transform( new ProjNode(call, TypeFunc::Memory) );
// Set the RawPtr memory state only. This covers all the heap top/GC stuff
// We also use hook_mem to extract specific effects from arraycopy stubs.
set_memory(mem, hook_mem);
@@ -1864,12 +1820,16 @@
// Replace the call with the current state of the kit.
-void GraphKit::replace_call(CallNode* call, Node* result) {
+void GraphKit::replace_call(CallNode* call, Node* result, bool do_replaced_nodes) {
JVMState* ejvms = NULL;
if (has_exceptions()) {
ejvms = transfer_exceptions_into_jvms();
}
+ ReplacedNodes replaced_nodes = map()->replaced_nodes();
+ ReplacedNodes replaced_nodes_exception;
+ Node* ex_ctl = top();
+
SafePointNode* final_state = stop();
// Find all the needed outputs of this call
@@ -1886,6 +1846,10 @@
C->gvn_replace_by(callprojs.fallthrough_catchproj, final_ctl);
}
if (callprojs.fallthrough_memproj != NULL) {
+ if (final_mem->is_MergeMem()) {
+ // Parser's exits MergeMem was not transformed but may be optimized
+ final_mem = _gvn.transform(final_mem);
+ }
C->gvn_replace_by(callprojs.fallthrough_memproj, final_mem);
}
if (callprojs.fallthrough_ioproj != NULL) {
@@ -1917,10 +1881,13 @@
// Load my combined exception state into the kit, with all phis transformed:
SafePointNode* ex_map = ekit.combine_and_pop_all_exception_states();
+ replaced_nodes_exception = ex_map->replaced_nodes();
Node* ex_oop = ekit.use_exception_state(ex_map);
+
if (callprojs.catchall_catchproj != NULL) {
C->gvn_replace_by(callprojs.catchall_catchproj, ekit.control());
+ ex_ctl = ekit.control();
}
if (callprojs.catchall_memproj != NULL) {
C->gvn_replace_by(callprojs.catchall_memproj, ekit.reset_memory());
@@ -1953,6 +1920,13 @@
_gvn.transform(wl.pop());
}
}
+
+ if (callprojs.fallthrough_catchproj != NULL && !final_ctl->is_top() && do_replaced_nodes) {
+ replaced_nodes.apply(C, final_ctl);
+ }
+ if (!ex_ctl->is_top() && do_replaced_nodes) {
+ replaced_nodes_exception.apply(C, ex_ctl);
+ }
}
@@ -1968,7 +1942,7 @@
int adr_type = Compile::AliasIdxRaw;
Node* ctrl = control();
Node* cnt = make_load(ctrl, counter_addr, TypeInt::INT, T_INT, adr_type, MemNode::unordered);
- Node* incr = _gvn.transform(new (C) AddINode(cnt, _gvn.intcon(1)));
+ Node* incr = _gvn.transform(new AddINode(cnt, _gvn.intcon(1)));
store_to_memory(ctrl, counter_addr, incr, T_INT, adr_type, MemNode::unordered);
}
@@ -2087,7 +2061,7 @@
// The debug info is the only real input to this call.
// Halt-and-catch fire here. The above call should never return!
- HaltNode* halt = new(C) HaltNode(control(), frameptr());
+ HaltNode* halt = new HaltNode(control(), frameptr());
_gvn.set_type_bottom(halt);
root()->add_req(halt);
@@ -2169,7 +2143,7 @@
// the new type. The new type depends on the control: what
// profiling tells us is only valid from here as far as we can
// tell.
- Node* cast = new(C) CheckCastPPNode(control(), n, current_type->remove_speculative()->join_speculative(spec_type));
+ Node* cast = new CheckCastPPNode(control(), n, current_type->remove_speculative()->join_speculative(spec_type));
cast = _gvn.transform(cast);
replace_in_map(n, cast);
n = cast;
@@ -2287,7 +2261,7 @@
Node* GraphKit::precision_rounding(Node* n) {
return UseStrictFP && _method->flags().is_strict()
&& UseSSE == 0 && Matcher::strict_fp_requires_explicit_rounding
- ? _gvn.transform( new (C) RoundFloatNode(0, n) )
+ ? _gvn.transform( new RoundFloatNode(0, n) )
: n;
}
@@ -2295,7 +2269,7 @@
Node* GraphKit::dprecision_rounding(Node *n) {
return UseStrictFP && _method->flags().is_strict()
&& UseSSE <= 1 && Matcher::strict_fp_requires_explicit_rounding
- ? _gvn.transform( new (C) RoundDoubleNode(0, n) )
+ ? _gvn.transform( new RoundDoubleNode(0, n) )
: n;
}
@@ -2303,7 +2277,7 @@
Node* GraphKit::dstore_rounding(Node* n) {
return Matcher::strict_fp_requires_explicit_rounding
&& UseSSE <= 1
- ? _gvn.transform( new (C) RoundDoubleNode(0, n) )
+ ? _gvn.transform( new RoundDoubleNode(0, n) )
: n;
}
@@ -2382,11 +2356,11 @@
IfNode *opt_iff = _gvn.transform(iff)->as_If();
// Fast path taken; set region slot 2
- Node *fast_taken = _gvn.transform( new (C) IfFalseNode(opt_iff) );
+ Node *fast_taken = _gvn.transform( new IfFalseNode(opt_iff) );
region->init_req(2,fast_taken); // Capture fast-control
// Fast path not-taken, i.e. slow path
- Node *slow_taken = _gvn.transform( new (C) IfTrueNode(opt_iff) );
+ Node *slow_taken = _gvn.transform( new IfTrueNode(opt_iff) );
return slow_taken;
}
@@ -2410,12 +2384,12 @@
}
CallNode* call;
if (!is_leaf) {
- call = new(C) CallStaticJavaNode(call_type, call_addr, call_name,
+ call = new CallStaticJavaNode(call_type, call_addr, call_name,
bci(), adr_type);
} else if (flags & RC_NO_FP) {
- call = new(C) CallLeafNoFPNode(call_type, call_addr, call_name, adr_type);
+ call = new CallLeafNoFPNode(call_type, call_addr, call_name, adr_type);
} else {
- call = new(C) CallLeafNode(call_type, call_addr, call_name, adr_type);
+ call = new CallLeafNode(call_type, call_addr, call_name, adr_type);
}
// The following is similar to set_edges_for_java_call,
@@ -2476,7 +2450,7 @@
}
if (has_io) {
- set_i_o(_gvn.transform(new (C) ProjNode(call, TypeFunc::I_O)));
+ set_i_o(_gvn.transform(new ProjNode(call, TypeFunc::I_O)));
}
return call;
@@ -2490,48 +2464,55 @@
Node* new_slice = mms.memory2();
if (old_slice != new_slice) {
PhiNode* phi;
- if (new_slice->is_Phi() && new_slice->as_Phi()->region() == region) {
- phi = new_slice->as_Phi();
- #ifdef ASSERT
- if (old_slice->is_Phi() && old_slice->as_Phi()->region() == region)
- old_slice = old_slice->in(new_path);
- // Caller is responsible for ensuring that any pre-existing
- // phis are already aware of old memory.
- int old_path = (new_path > 1) ? 1 : 2; // choose old_path != new_path
- assert(phi->in(old_path) == old_slice, "pre-existing phis OK");
- #endif
- mms.set_memory(phi);
+ if (old_slice->is_Phi() && old_slice->as_Phi()->region() == region) {
+ if (mms.is_empty()) {
+ // clone base memory Phi's inputs for this memory slice
+ assert(old_slice == mms.base_memory(), "sanity");
+ phi = PhiNode::make(region, NULL, Type::MEMORY, mms.adr_type(C));
+ _gvn.set_type(phi, Type::MEMORY);
+ for (uint i = 1; i < phi->req(); i++) {
+ phi->init_req(i, old_slice->in(i));
+ }
+ } else {
+ phi = old_slice->as_Phi(); // Phi was generated already
+ }
} else {
phi = PhiNode::make(region, old_slice, Type::MEMORY, mms.adr_type(C));
_gvn.set_type(phi, Type::MEMORY);
- phi->set_req(new_path, new_slice);
- mms.set_memory(_gvn.transform(phi)); // assume it is complete
}
+ phi->set_req(new_path, new_slice);
+ mms.set_memory(phi);
}
}
}
//------------------------------make_slow_call_ex------------------------------
// Make the exception handler hookups for the slow call
-void GraphKit::make_slow_call_ex(Node* call, ciInstanceKlass* ex_klass, bool separate_io_proj) {
+void GraphKit::make_slow_call_ex(Node* call, ciInstanceKlass* ex_klass, bool separate_io_proj, bool deoptimize) {
if (stopped()) return;
// Make a catch node with just two handlers: fall-through and catch-all
- Node* i_o = _gvn.transform( new (C) ProjNode(call, TypeFunc::I_O, separate_io_proj) );
- Node* catc = _gvn.transform( new (C) CatchNode(control(), i_o, 2) );
- Node* norm = _gvn.transform( new (C) CatchProjNode(catc, CatchProjNode::fall_through_index, CatchProjNode::no_handler_bci) );
- Node* excp = _gvn.transform( new (C) CatchProjNode(catc, CatchProjNode::catch_all_index, CatchProjNode::no_handler_bci) );
+ Node* i_o = _gvn.transform( new ProjNode(call, TypeFunc::I_O, separate_io_proj) );
+ Node* catc = _gvn.transform( new CatchNode(control(), i_o, 2) );
+ Node* norm = _gvn.transform( new CatchProjNode(catc, CatchProjNode::fall_through_index, CatchProjNode::no_handler_bci) );
+ Node* excp = _gvn.transform( new CatchProjNode(catc, CatchProjNode::catch_all_index, CatchProjNode::no_handler_bci) );
{ PreserveJVMState pjvms(this);
set_control(excp);
set_i_o(i_o);
if (excp != top()) {
- // Create an exception state also.
- // Use an exact type if the caller has specified a specific exception.
- const Type* ex_type = TypeOopPtr::make_from_klass_unique(ex_klass)->cast_to_ptr_type(TypePtr::NotNull);
- Node* ex_oop = new (C) CreateExNode(ex_type, control(), i_o);
- add_exception_state(make_exception_state(_gvn.transform(ex_oop)));
+ if (deoptimize) {
+ // Deoptimize if an exception is caught. Don't construct exception state in this case.
+ uncommon_trap(Deoptimization::Reason_unhandled,
+ Deoptimization::Action_none);
+ } else {
+ // Create an exception state also.
+ // Use an exact type if the caller has specified a specific exception.
+ const Type* ex_type = TypeOopPtr::make_from_klass_unique(ex_klass)->cast_to_ptr_type(TypePtr::NotNull);
+ Node* ex_oop = new CreateExNode(ex_type, control(), i_o);
+ add_exception_state(make_exception_state(_gvn.transform(ex_oop)));
+ }
}
}
@@ -2580,11 +2561,11 @@
case SSC_easy_test:
{
// Just do a direct pointer compare and be done.
- Node* cmp = _gvn.transform( new(C) CmpPNode(subklass, superklass) );
- Node* bol = _gvn.transform( new(C) BoolNode(cmp, BoolTest::eq) );
+ Node* cmp = _gvn.transform( new CmpPNode(subklass, superklass) );
+ Node* bol = _gvn.transform( new BoolNode(cmp, BoolTest::eq) );
IfNode* iff = create_and_xform_if(control(), bol, PROB_STATIC_FREQUENT, COUNT_UNKNOWN);
- set_control( _gvn.transform( new(C) IfTrueNode (iff) ) );
- return _gvn.transform( new(C) IfFalseNode(iff) );
+ set_control( _gvn.transform( new IfTrueNode (iff) ) );
+ return _gvn.transform( new IfFalseNode(iff) );
}
case SSC_full_test:
break;
@@ -2599,7 +2580,7 @@
// First load the super-klass's check-offset
Node *p1 = basic_plus_adr( superklass, superklass, in_bytes(Klass::super_check_offset_offset()) );
- Node *chk_off = _gvn.transform(new (C) LoadINode(NULL, memory(p1), p1, _gvn.type(p1)->is_ptr(),
+ Node *chk_off = _gvn.transform(new LoadINode(NULL, memory(p1), p1, _gvn.type(p1)->is_ptr(),
TypeInt::INT, MemNode::unordered));
int cacheoff_con = in_bytes(Klass::secondary_super_cache_offset());
bool might_be_cache = (find_int_con(chk_off, cacheoff_con) == cacheoff_con);
@@ -2611,7 +2592,7 @@
// Worst-case type is a little odd: NULL is allowed as a result (usually
// klass loads can never produce a NULL).
Node *chk_off_X = ConvI2X(chk_off);
- Node *p2 = _gvn.transform( new (C) AddPNode(subklass,subklass,chk_off_X) );
+ Node *p2 = _gvn.transform( new AddPNode(subklass,subklass,chk_off_X) );
// For some types like interfaces the following loadKlass is from a 1-word
// cache which is mutable so can't use immutable memory. Other
// types load from the super-class display table which is immutable.
@@ -2625,11 +2606,11 @@
// See if we get an immediate positive hit. Happens roughly 83% of the
// time. Test to see if the value loaded just previously from the subklass
// is exactly the superklass.
- Node *cmp1 = _gvn.transform( new (C) CmpPNode( superklass, nkls ) );
- Node *bol1 = _gvn.transform( new (C) BoolNode( cmp1, BoolTest::eq ) );
+ Node *cmp1 = _gvn.transform( new CmpPNode( superklass, nkls ) );
+ Node *bol1 = _gvn.transform( new BoolNode( cmp1, BoolTest::eq ) );
IfNode *iff1 = create_and_xform_if( control(), bol1, PROB_LIKELY(0.83f), COUNT_UNKNOWN );
- Node *iftrue1 = _gvn.transform( new (C) IfTrueNode ( iff1 ) );
- set_control( _gvn.transform( new (C) IfFalseNode( iff1 ) ) );
+ Node *iftrue1 = _gvn.transform( new IfTrueNode ( iff1 ) );
+ set_control( _gvn.transform( new IfFalseNode( iff1 ) ) );
// Compile speed common case: Check for being deterministic right now. If
// chk_off is a constant and not equal to cacheoff then we are NOT a
@@ -2642,9 +2623,9 @@
}
// Gather the various success & failures here
- RegionNode *r_ok_subtype = new (C) RegionNode(4);
+ RegionNode *r_ok_subtype = new RegionNode(4);
record_for_igvn(r_ok_subtype);
- RegionNode *r_not_subtype = new (C) RegionNode(3);
+ RegionNode *r_not_subtype = new RegionNode(3);
record_for_igvn(r_not_subtype);
r_ok_subtype->init_req(1, iftrue1);
@@ -2655,20 +2636,20 @@
// cache. If it points to the display (and NOT the cache) and the display
// missed then it's not a subtype.
Node *cacheoff = _gvn.intcon(cacheoff_con);
- Node *cmp2 = _gvn.transform( new (C) CmpINode( chk_off, cacheoff ) );
- Node *bol2 = _gvn.transform( new (C) BoolNode( cmp2, BoolTest::ne ) );
+ Node *cmp2 = _gvn.transform( new CmpINode( chk_off, cacheoff ) );
+ Node *bol2 = _gvn.transform( new BoolNode( cmp2, BoolTest::ne ) );
IfNode *iff2 = create_and_xform_if( control(), bol2, PROB_LIKELY(0.63f), COUNT_UNKNOWN );
- r_not_subtype->init_req(1, _gvn.transform( new (C) IfTrueNode (iff2) ) );
- set_control( _gvn.transform( new (C) IfFalseNode(iff2) ) );
+ r_not_subtype->init_req(1, _gvn.transform( new IfTrueNode (iff2) ) );
+ set_control( _gvn.transform( new IfFalseNode(iff2) ) );
// Check for self. Very rare to get here, but it is taken 1/3 the time.
// No performance impact (too rare) but allows sharing of secondary arrays
// which has some footprint reduction.
- Node *cmp3 = _gvn.transform( new (C) CmpPNode( subklass, superklass ) );
- Node *bol3 = _gvn.transform( new (C) BoolNode( cmp3, BoolTest::eq ) );
+ Node *cmp3 = _gvn.transform( new CmpPNode( subklass, superklass ) );
+ Node *bol3 = _gvn.transform( new BoolNode( cmp3, BoolTest::eq ) );
IfNode *iff3 = create_and_xform_if( control(), bol3, PROB_LIKELY(0.36f), COUNT_UNKNOWN );
- r_ok_subtype->init_req(2, _gvn.transform( new (C) IfTrueNode ( iff3 ) ) );
- set_control( _gvn.transform( new (C) IfFalseNode( iff3 ) ) );
+ r_ok_subtype->init_req(2, _gvn.transform( new IfTrueNode ( iff3 ) ) );
+ set_control( _gvn.transform( new IfFalseNode( iff3 ) ) );
// -- Roads not taken here: --
// We could also have chosen to perform the self-check at the beginning
@@ -2692,13 +2673,13 @@
// The decision to inline or out-of-line this final check is platform
// dependent, and is found in the AD file definition of PartialSubtypeCheck.
Node* psc = _gvn.transform(
- new (C) PartialSubtypeCheckNode(control(), subklass, superklass) );
-
- Node *cmp4 = _gvn.transform( new (C) CmpPNode( psc, null() ) );
- Node *bol4 = _gvn.transform( new (C) BoolNode( cmp4, BoolTest::ne ) );
+ new PartialSubtypeCheckNode(control(), subklass, superklass) );
+
+ Node *cmp4 = _gvn.transform( new CmpPNode( psc, null() ) );
+ Node *bol4 = _gvn.transform( new BoolNode( cmp4, BoolTest::ne ) );
IfNode *iff4 = create_and_xform_if( control(), bol4, PROB_FAIR, COUNT_UNKNOWN );
- r_not_subtype->init_req(2, _gvn.transform( new (C) IfTrueNode (iff4) ) );
- r_ok_subtype ->init_req(3, _gvn.transform( new (C) IfFalseNode(iff4) ) );
+ r_not_subtype->init_req(2, _gvn.transform( new IfTrueNode (iff4) ) );
+ r_ok_subtype ->init_req(3, _gvn.transform( new IfFalseNode(iff4) ) );
// Return false path; set default control to true path.
set_control( _gvn.transform(r_ok_subtype) );
@@ -2762,18 +2743,18 @@
const TypeKlassPtr* tklass = TypeKlassPtr::make(klass);
Node* recv_klass = load_object_klass(receiver);
Node* want_klass = makecon(tklass);
- Node* cmp = _gvn.transform( new(C) CmpPNode(recv_klass, want_klass) );
- Node* bol = _gvn.transform( new(C) BoolNode(cmp, BoolTest::eq) );
+ Node* cmp = _gvn.transform( new CmpPNode(recv_klass, want_klass) );
+ Node* bol = _gvn.transform( new BoolNode(cmp, BoolTest::eq) );
IfNode* iff = create_and_xform_if(control(), bol, prob, COUNT_UNKNOWN);
- set_control( _gvn.transform( new(C) IfTrueNode (iff) ));
- Node* fail = _gvn.transform( new(C) IfFalseNode(iff) );
+ set_control( _gvn.transform( new IfTrueNode (iff) ));
+ Node* fail = _gvn.transform( new IfFalseNode(iff) );
const TypeOopPtr* recv_xtype = tklass->as_instance_type();
assert(recv_xtype->klass_is_exact(), "");
// Subsume downstream occurrences of receiver with a cast to
// recv_xtype, since now we know what the type will be.
- Node* cast = new(C) CheckCastPPNode(control(), receiver, recv_xtype);
+ Node* cast = new CheckCastPPNode(control(), receiver, recv_xtype);
(*casted_receiver) = _gvn.transform(cast);
// (User must make the replace_in_map call.)
@@ -2920,8 +2901,8 @@
// Make the merge point
enum { _obj_path = 1, _fail_path, _null_path, PATH_LIMIT };
- RegionNode* region = new(C) RegionNode(PATH_LIMIT);
- Node* phi = new(C) PhiNode(region, TypeInt::BOOL);
+ RegionNode* region = new RegionNode(PATH_LIMIT);
+ Node* phi = new PhiNode(region, TypeInt::BOOL);
C->set_has_split_ifs(true); // Has chance for split-if optimization
ciProfileData* data = NULL;
@@ -3052,8 +3033,8 @@
// Make the merge point
enum { _obj_path = 1, _null_path, PATH_LIMIT };
- RegionNode* region = new (C) RegionNode(PATH_LIMIT);
- Node* phi = new (C) PhiNode(region, toop);
+ RegionNode* region = new RegionNode(PATH_LIMIT);
+ Node* phi = new PhiNode(region, toop);
C->set_has_split_ifs(true); // Has chance for split-if optimization
// Use null-cast information if it is available
@@ -3114,8 +3095,7 @@
Node* not_subtype_ctrl = gen_subtype_check( obj_klass, superklass );
// Plug in success path into the merge
- cast_obj = _gvn.transform(new (C) CheckCastPPNode(control(),
- not_null_obj, toop));
+ cast_obj = _gvn.transform(new CheckCastPPNode(control(), not_null_obj, toop));
// Failure path ends in uncommon trap (or may be dead - failure impossible)
if (failure_control == NULL) {
if (not_subtype_ctrl != top()) { // If failure is possible
@@ -3168,7 +3148,7 @@
mb->init_req(TypeFunc::Control, control());
mb->init_req(TypeFunc::Memory, reset_memory());
Node* membar = _gvn.transform(mb);
- set_control(_gvn.transform(new (C) ProjNode(membar, TypeFunc::Control)));
+ set_control(_gvn.transform(new ProjNode(membar, TypeFunc::Control)));
set_all_memory_call(membar);
return membar;
}
@@ -3197,11 +3177,11 @@
mb->set_req(TypeFunc::Memory, memory(alias_idx));
}
Node* membar = _gvn.transform(mb);
- set_control(_gvn.transform(new (C) ProjNode(membar, TypeFunc::Control)));
+ set_control(_gvn.transform(new ProjNode(membar, TypeFunc::Control)));
if (alias_idx == Compile::AliasIdxBot) {
- merged_memory()->set_base_memory(_gvn.transform(new (C) ProjNode(membar, TypeFunc::Memory)));
+ merged_memory()->set_base_memory(_gvn.transform(new ProjNode(membar, TypeFunc::Memory)));
} else {
- set_memory(_gvn.transform(new (C) ProjNode(membar, TypeFunc::Memory)),alias_idx);
+ set_memory(_gvn.transform(new ProjNode(membar, TypeFunc::Memory)),alias_idx);
}
return membar;
}
@@ -3221,10 +3201,10 @@
assert(dead_locals_are_killed(), "should kill locals before sync. point");
// Box the stack location
- Node* box = _gvn.transform(new (C) BoxLockNode(next_monitor()));
+ Node* box = _gvn.transform(new BoxLockNode(next_monitor()));
Node* mem = reset_memory();
- FastLockNode * flock = _gvn.transform(new (C) FastLockNode(0, obj, box) )->as_FastLock();
+ FastLockNode * flock = _gvn.transform(new FastLockNode(0, obj, box) )->as_FastLock();
if (UseBiasedLocking && PrintPreciseBiasedLockingStatistics) {
// Create the counters for this fast lock.
flock->create_lock_counter(sync_jvms()); // sync_jvms used to get current bci
@@ -3238,7 +3218,7 @@
map()->push_monitor( flock );
const TypeFunc *tf = LockNode::lock_type();
- LockNode *lock = new (C) LockNode(C, tf);
+ LockNode *lock = new LockNode(C, tf);
lock->init_req( TypeFunc::Control, control() );
lock->init_req( TypeFunc::Memory , mem );
@@ -3292,7 +3272,7 @@
insert_mem_bar(Op_MemBarReleaseLock);
const TypeFunc *tf = OptoRuntime::complete_monitor_exit_Type();
- UnlockNode *unlock = new (C) UnlockNode(C, tf);
+ UnlockNode *unlock = new UnlockNode(C, tf);
uint raw_idx = Compile::AliasIdxRaw;
unlock->init_req( TypeFunc::Control, control() );
unlock->init_req( TypeFunc::Memory , memory(raw_idx) );
@@ -3353,24 +3333,25 @@
//---------------------------set_output_for_allocation-------------------------
Node* GraphKit::set_output_for_allocation(AllocateNode* alloc,
- const TypeOopPtr* oop_type) {
+ const TypeOopPtr* oop_type,
+ bool deoptimize_on_exception) {
int rawidx = Compile::AliasIdxRaw;
alloc->set_req( TypeFunc::FramePtr, frameptr() );
add_safepoint_edges(alloc);
Node* allocx = _gvn.transform(alloc);
- set_control( _gvn.transform(new (C) ProjNode(allocx, TypeFunc::Control) ) );
+ set_control( _gvn.transform(new ProjNode(allocx, TypeFunc::Control) ) );
// create memory projection for i_o
- set_memory ( _gvn.transform( new (C) ProjNode(allocx, TypeFunc::Memory, true) ), rawidx );
- make_slow_call_ex(allocx, env()->Throwable_klass(), true);
+ set_memory ( _gvn.transform( new ProjNode(allocx, TypeFunc::Memory, true) ), rawidx );
+ make_slow_call_ex(allocx, env()->Throwable_klass(), true, deoptimize_on_exception);
// create a memory projection as for the normal control path
- Node* malloc = _gvn.transform(new (C) ProjNode(allocx, TypeFunc::Memory));
+ Node* malloc = _gvn.transform(new ProjNode(allocx, TypeFunc::Memory));
set_memory(malloc, rawidx);
// a normal slow-call doesn't change i_o, but an allocation does
// we create a separate i_o projection for the normal control path
- set_i_o(_gvn.transform( new (C) ProjNode(allocx, TypeFunc::I_O, false) ) );
- Node* rawoop = _gvn.transform( new (C) ProjNode(allocx, TypeFunc::Parms) );
+ set_i_o(_gvn.transform( new ProjNode(allocx, TypeFunc::I_O, false) ) );
+ Node* rawoop = _gvn.transform( new ProjNode(allocx, TypeFunc::Parms) );
// put in an initialization barrier
InitializeNode* init = insert_mem_bar_volatile(Op_Initialize, rawidx,
@@ -3406,7 +3387,7 @@
}
// Cast raw oop to the real thing...
- Node* javaoop = new (C) CheckCastPPNode(control(), rawoop, oop_type);
+ Node* javaoop = new CheckCastPPNode(control(), rawoop, oop_type);
javaoop = _gvn.transform(javaoop);
C->set_recent_alloc(control(), javaoop);
assert(just_allocated_object(control()) == javaoop, "just allocated");
@@ -3439,9 +3420,11 @@
// The optional arguments are for specialized use by intrinsics:
// - If 'extra_slow_test' if not null is an extra condition for the slow-path.
// - If 'return_size_val', report the the total object size to the caller.
+// - deoptimize_on_exception controls how Java exceptions are handled (rethrow vs deoptimize)
Node* GraphKit::new_instance(Node* klass_node,
Node* extra_slow_test,
- Node* *return_size_val) {
+ Node* *return_size_val,
+ bool deoptimize_on_exception) {
// Compute size in doublewords
// The size is always an integral number of doublewords, represented
// as a positive bytewise size stored in the klass's layout_helper.
@@ -3465,9 +3448,9 @@
// (It may be stress-tested by specifying StressReflectiveCode.)
// Basically, we want to get into the VM is there's an illegal argument.
Node* bit = intcon(Klass::_lh_instance_slow_path_bit);
- initial_slow_test = _gvn.transform( new (C) AndINode(layout_val, bit) );
+ initial_slow_test = _gvn.transform( new AndINode(layout_val, bit) );
if (extra_slow_test != intcon(0)) {
- initial_slow_test = _gvn.transform( new (C) OrINode(initial_slow_test, extra_slow_test) );
+ initial_slow_test = _gvn.transform( new OrINode(initial_slow_test, extra_slow_test) );
}
// (Macro-expander will further convert this to a Bool, if necessary.)
}
@@ -3484,7 +3467,7 @@
// Clear the low bits to extract layout_helper_size_in_bytes:
assert((int)Klass::_lh_instance_slow_path_bit < BytesPerLong, "clear bit");
Node* mask = MakeConX(~ (intptr_t)right_n_bits(LogBytesPerLong));
- size = _gvn.transform( new (C) AndXNode(size, mask) );
+ size = _gvn.transform( new AndXNode(size, mask) );
}
if (return_size_val != NULL) {
(*return_size_val) = size;
@@ -3504,13 +3487,12 @@
Node *mem = reset_memory();
set_all_memory(mem); // Create new memory state
- AllocateNode* alloc
- = new (C) AllocateNode(C, AllocateNode::alloc_type(Type::TOP),
- control(), mem, i_o(),
- size, klass_node,
- initial_slow_test);
-
- return set_output_for_allocation(alloc, oop_type);
+ AllocateNode* alloc = new AllocateNode(C, AllocateNode::alloc_type(Type::TOP),
+ control(), mem, i_o(),
+ size, klass_node,
+ initial_slow_test);
+
+ return set_output_for_allocation(alloc, oop_type, deoptimize_on_exception);
}
//-------------------------------new_array-------------------------------------
@@ -3520,7 +3502,8 @@
Node* GraphKit::new_array(Node* klass_node, // array klass (maybe variable)
Node* length, // number of array elements
int nargs, // number of arguments to push back for uncommon trap
- Node* *return_size_val) {
+ Node* *return_size_val,
+ bool deoptimize_on_exception) {
jint layout_con = Klass::_lh_neutral_value;
Node* layout_val = get_layout_helper(klass_node, layout_con);
int layout_is_con = (layout_val == NULL);
@@ -3531,8 +3514,8 @@
// Optimistically assume that it is a subtype of Object[],
// so that we can fold up all the address arithmetic.
layout_con = Klass::array_layout_helper(T_OBJECT);
- Node* cmp_lh = _gvn.transform( new(C) CmpINode(layout_val, intcon(layout_con)) );
- Node* bol_lh = _gvn.transform( new(C) BoolNode(cmp_lh, BoolTest::eq) );
+ Node* cmp_lh = _gvn.transform( new CmpINode(layout_val, intcon(layout_con)) );
+ Node* bol_lh = _gvn.transform( new BoolNode(cmp_lh, BoolTest::eq) );
{ BuildCutout unless(this, bol_lh, PROB_MAX);
inc_sp(nargs);
uncommon_trap(Deoptimization::Reason_class_check,
@@ -3556,8 +3539,8 @@
fast_size_limit <<= (LogBytesPerLong - log2_esize);
}
- Node* initial_slow_cmp = _gvn.transform( new (C) CmpUNode( length, intcon( fast_size_limit ) ) );
- Node* initial_slow_test = _gvn.transform( new (C) BoolNode( initial_slow_cmp, BoolTest::gt ) );
+ Node* initial_slow_cmp = _gvn.transform( new CmpUNode( length, intcon( fast_size_limit ) ) );
+ Node* initial_slow_test = _gvn.transform( new BoolNode( initial_slow_cmp, BoolTest::gt ) );
if (initial_slow_test->is_Bool()) {
// Hide it behind a CMoveI, or else PhaseIdealLoop::split_up will get sick.
initial_slow_test = initial_slow_test->as_Bool()->as_int_value(&_gvn);
@@ -3585,10 +3568,10 @@
} else {
Node* hss = intcon(Klass::_lh_header_size_shift);
Node* hsm = intcon(Klass::_lh_header_size_mask);
- Node* hsize = _gvn.transform( new(C) URShiftINode(layout_val, hss) );
- hsize = _gvn.transform( new(C) AndINode(hsize, hsm) );
+ Node* hsize = _gvn.transform( new URShiftINode(layout_val, hss) );
+ hsize = _gvn.transform( new AndINode(hsize, hsm) );
Node* mask = intcon(round_mask);
- header_size = _gvn.transform( new(C) AddINode(hsize, mask) );
+ header_size = _gvn.transform( new AddINode(hsize, mask) );
}
Node* elem_shift = NULL;
@@ -3613,7 +3596,7 @@
jlong size_max = arrayOopDesc::max_array_length(T_BYTE);
if (size_max > tllen->_hi) size_max = tllen->_hi;
const TypeLong* tlcon = TypeLong::make(CONST64(0), size_max, Type::WidenMin);
- lengthx = _gvn.transform( new (C) ConvI2LNode(length, tlcon));
+ lengthx = _gvn.transform( new ConvI2LNode(length, tlcon));
}
}
#endif
@@ -3624,11 +3607,11 @@
// after a successful allocation.
Node* abody = lengthx;
if (elem_shift != NULL)
- abody = _gvn.transform( new(C) LShiftXNode(lengthx, elem_shift) );
- Node* size = _gvn.transform( new(C) AddXNode(headerx, abody) );
+ abody = _gvn.transform( new LShiftXNode(lengthx, elem_shift) );
+ Node* size = _gvn.transform( new AddXNode(headerx, abody) );
if (round_mask != 0) {
Node* mask = MakeConX(~round_mask);
- size = _gvn.transform( new(C) AndXNode(size, mask) );
+ size = _gvn.transform( new AndXNode(size, mask) );
}
// else if round_mask == 0, the size computation is self-rounding
@@ -3646,11 +3629,11 @@
// Create the AllocateArrayNode and its result projections
AllocateArrayNode* alloc
- = new (C) AllocateArrayNode(C, AllocateArrayNode::alloc_type(TypeInt::INT),
- control(), mem, i_o(),
- size, klass_node,
- initial_slow_test,
- length);
+ = new AllocateArrayNode(C, AllocateArrayNode::alloc_type(TypeInt::INT),
+ control(), mem, i_o(),
+ size, klass_node,
+ initial_slow_test,
+ length);
// Cast to correct type. Note that the klass_node may be constant or not,
// and in the latter case the actual array type will be inexact also.
@@ -3663,7 +3646,7 @@
ary_type = ary_type->is_aryptr()->cast_to_size(length_type);
}
- Node* javaoop = set_output_for_allocation(alloc, ary_type);
+ Node* javaoop = set_output_for_allocation(alloc, ary_type, deoptimize_on_exception);
// Cast length on remaining path to be as narrow as possible
if (map()->find_edge(length) >= 0) {
@@ -3760,10 +3743,10 @@
}
Node *cont = _gvn.intcon(1);
- Node* opq = _gvn.transform(new (C) Opaque1Node(C, cont));
- Node *bol = _gvn.transform(new (C) Conv2BNode(opq));
+ Node* opq = _gvn.transform(new Opaque1Node(C, cont));
+ Node *bol = _gvn.transform(new Conv2BNode(opq));
IfNode* iff = create_and_map_if(control(), bol, PROB_MAX, COUNT_UNKNOWN);
- Node* iffalse = _gvn.transform(new (C) IfFalseNode(iff));
+ Node* iffalse = _gvn.transform(new IfFalseNode(iff));
C->add_predicate_opaq(opq);
{
PreserveJVMState pjvms(this);
@@ -3771,7 +3754,7 @@
inc_sp(nargs);
uncommon_trap(reason, Deoptimization::Action_maybe_recompile);
}
- Node* iftrue = _gvn.transform(new (C) IfTrueNode(iff));
+ Node* iftrue = _gvn.transform(new IfTrueNode(iff));
set_control(iftrue);
}
@@ -3963,7 +3946,7 @@
__ if_then(index, BoolTest::ne, zeroX, likely); {
// decrement the index
- Node* next_index = _gvn.transform(new (C) SubXNode(index, __ ConX(sizeof(intptr_t))));
+ Node* next_index = _gvn.transform(new SubXNode(index, __ ConX(sizeof(intptr_t))));
// Now get the buffer location we will log the previous value into and store it
Node *log_addr = __ AddP(no_base, buffer, next_index);
@@ -4006,7 +3989,7 @@
// Now do the queue work
__ if_then(index, BoolTest::ne, zeroX); {
- Node* next_index = _gvn.transform(new (C) SubXNode(index, __ ConX(sizeof(intptr_t))));
+ Node* next_index = _gvn.transform(new SubXNode(index, __ ConX(sizeof(intptr_t))));
Node* log_addr = __ AddP(no_base, buffer, next_index);
// Order, see storeCM.
@@ -4213,5 +4196,5 @@
Node* GraphKit::cast_array_to_stable(Node* ary, const TypeAryPtr* ary_type) {
// Reify the property as a CastPP node in Ideal graph to comply with monotonicity
// assumption of CCP analysis.
- return _gvn.transform(new(C) CastPPNode(ary, ary_type->cast_to_stable(true)));
+ return _gvn.transform(new CastPPNode(ary, ary_type->cast_to_stable(true)));
}
--- a/hotspot/src/share/vm/opto/graphKit.hpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/graphKit.hpp Wed Jul 05 19:46:31 2017 +0200
@@ -309,31 +309,31 @@
// Some convenient shortcuts for common nodes
- Node* IfTrue(IfNode* iff) { return _gvn.transform(new (C) IfTrueNode(iff)); }
- Node* IfFalse(IfNode* iff) { return _gvn.transform(new (C) IfFalseNode(iff)); }
+ Node* IfTrue(IfNode* iff) { return _gvn.transform(new IfTrueNode(iff)); }
+ Node* IfFalse(IfNode* iff) { return _gvn.transform(new IfFalseNode(iff)); }
- Node* AddI(Node* l, Node* r) { return _gvn.transform(new (C) AddINode(l, r)); }
- Node* SubI(Node* l, Node* r) { return _gvn.transform(new (C) SubINode(l, r)); }
- Node* MulI(Node* l, Node* r) { return _gvn.transform(new (C) MulINode(l, r)); }
- Node* DivI(Node* ctl, Node* l, Node* r) { return _gvn.transform(new (C) DivINode(ctl, l, r)); }
+ Node* AddI(Node* l, Node* r) { return _gvn.transform(new AddINode(l, r)); }
+ Node* SubI(Node* l, Node* r) { return _gvn.transform(new SubINode(l, r)); }
+ Node* MulI(Node* l, Node* r) { return _gvn.transform(new MulINode(l, r)); }
+ Node* DivI(Node* ctl, Node* l, Node* r) { return _gvn.transform(new DivINode(ctl, l, r)); }
- Node* AndI(Node* l, Node* r) { return _gvn.transform(new (C) AndINode(l, r)); }
- Node* OrI(Node* l, Node* r) { return _gvn.transform(new (C) OrINode(l, r)); }
- Node* XorI(Node* l, Node* r) { return _gvn.transform(new (C) XorINode(l, r)); }
+ Node* AndI(Node* l, Node* r) { return _gvn.transform(new AndINode(l, r)); }
+ Node* OrI(Node* l, Node* r) { return _gvn.transform(new OrINode(l, r)); }
+ Node* XorI(Node* l, Node* r) { return _gvn.transform(new XorINode(l, r)); }
- Node* MaxI(Node* l, Node* r) { return _gvn.transform(new (C) MaxINode(l, r)); }
- Node* MinI(Node* l, Node* r) { return _gvn.transform(new (C) MinINode(l, r)); }
+ Node* MaxI(Node* l, Node* r) { return _gvn.transform(new MaxINode(l, r)); }
+ Node* MinI(Node* l, Node* r) { return _gvn.transform(new MinINode(l, r)); }
- Node* LShiftI(Node* l, Node* r) { return _gvn.transform(new (C) LShiftINode(l, r)); }
- Node* RShiftI(Node* l, Node* r) { return _gvn.transform(new (C) RShiftINode(l, r)); }
- Node* URShiftI(Node* l, Node* r) { return _gvn.transform(new (C) URShiftINode(l, r)); }
+ Node* LShiftI(Node* l, Node* r) { return _gvn.transform(new LShiftINode(l, r)); }
+ Node* RShiftI(Node* l, Node* r) { return _gvn.transform(new RShiftINode(l, r)); }
+ Node* URShiftI(Node* l, Node* r) { return _gvn.transform(new URShiftINode(l, r)); }
- Node* CmpI(Node* l, Node* r) { return _gvn.transform(new (C) CmpINode(l, r)); }
- Node* CmpL(Node* l, Node* r) { return _gvn.transform(new (C) CmpLNode(l, r)); }
- Node* CmpP(Node* l, Node* r) { return _gvn.transform(new (C) CmpPNode(l, r)); }
- Node* Bool(Node* cmp, BoolTest::mask relop) { return _gvn.transform(new (C) BoolNode(cmp, relop)); }
+ Node* CmpI(Node* l, Node* r) { return _gvn.transform(new CmpINode(l, r)); }
+ Node* CmpL(Node* l, Node* r) { return _gvn.transform(new CmpLNode(l, r)); }
+ Node* CmpP(Node* l, Node* r) { return _gvn.transform(new CmpPNode(l, r)); }
+ Node* Bool(Node* cmp, BoolTest::mask relop) { return _gvn.transform(new BoolNode(cmp, relop)); }
- Node* AddP(Node* b, Node* a, Node* o) { return _gvn.transform(new (C) AddPNode(b, a, o)); }
+ Node* AddP(Node* b, Node* a, Node* o) { return _gvn.transform(new AddPNode(b, a, o)); }
// Convert between int and long, and size_t.
// (See macros ConvI2X, etc., in type.hpp for ConvI2X, etc.)
@@ -690,7 +690,7 @@
// Replace the call with the current state of the kit. Requires
// that the call was generated with separate io_projs so that
// exceptional control flow can be handled properly.
- void replace_call(CallNode* call, Node* result);
+ void replace_call(CallNode* call, Node* result, bool do_replaced_nodes = false);
// helper functions for statistics
void increment_counter(address counter_addr); // increment a debug counter
@@ -807,7 +807,7 @@
// merge in all memory slices from new_mem, along the given path
void merge_memory(Node* new_mem, Node* region, int new_path);
- void make_slow_call_ex(Node* call, ciInstanceKlass* ex_klass, bool separate_io_proj);
+ void make_slow_call_ex(Node* call, ciInstanceKlass* ex_klass, bool separate_io_proj, bool deoptimize = false);
// Helper functions to build synchronizations
int next_monitor();
@@ -849,13 +849,16 @@
// implementation of object creation
Node* set_output_for_allocation(AllocateNode* alloc,
- const TypeOopPtr* oop_type);
+ const TypeOopPtr* oop_type,
+ bool deoptimize_on_exception=false);
Node* get_layout_helper(Node* klass_node, jint& constant_value);
Node* new_instance(Node* klass_node,
Node* slow_test = NULL,
- Node* *return_size_val = NULL);
+ Node* *return_size_val = NULL,
+ bool deoptimize_on_exception = false);
Node* new_array(Node* klass_node, Node* count_val, int nargs,
- Node* *return_size_val = NULL);
+ Node* *return_size_val = NULL,
+ bool deoptimize_on_exception = false);
// java.lang.String helpers
Node* load_String_offset(Node* ctrl, Node* str);
@@ -867,7 +870,7 @@
// Handy for making control flow
IfNode* create_and_map_if(Node* ctrl, Node* tst, float prob, float cnt) {
- IfNode* iff = new (C) IfNode(ctrl, tst, prob, cnt);// New IfNode's
+ IfNode* iff = new IfNode(ctrl, tst, prob, cnt);// New IfNode's
_gvn.set_type(iff, iff->Value(&_gvn)); // Value may be known at parse-time
// Place 'if' on worklist if it will be in graph
if (!tst->is_Con()) record_for_igvn(iff); // Range-check and Null-check removal is later
@@ -875,7 +878,7 @@
}
IfNode* create_and_xform_if(Node* ctrl, Node* tst, float prob, float cnt) {
- IfNode* iff = new (C) IfNode(ctrl, tst, prob, cnt);// New IfNode's
+ IfNode* iff = new IfNode(ctrl, tst, prob, cnt);// New IfNode's
_gvn.transform(iff); // Value may be known at parse-time
// Place 'if' on worklist if it will be in graph
if (!tst->is_Con()) record_for_igvn(iff); // Range-check and Null-check removal is later
--- a/hotspot/src/share/vm/opto/idealKit.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/idealKit.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -86,7 +86,7 @@
}
// Delay gvn.tranform on if-nodes until construction is finished
// to prevent a constant bool input from discarding a control output.
- IfNode* iff = delay_transform(new (C) IfNode(ctrl(), bol, prob, cnt))->as_If();
+ IfNode* iff = delay_transform(new IfNode(ctrl(), bol, prob, cnt))->as_If();
Node* then = IfTrue(iff);
Node* elsen = IfFalse(iff);
Node* else_cvstate = copy_cvstate();
@@ -205,7 +205,7 @@
assert(_cvstate != NULL, "must declare variables before labels");
Node* lab = new_cvstate();
int sz = 1 + goto_ct + 1 /* fall thru */;
- Node* reg = delay_transform(new (C) RegionNode(sz));
+ Node* reg = delay_transform(new RegionNode(sz));
lab->init_req(TypeFunc::Control, reg);
return lab;
}
@@ -312,7 +312,7 @@
//-----------------------------new_cvstate-----------------------------------
Node* IdealKit::new_cvstate() {
uint sz = _var_ct + first_var;
- return new (C) Node(sz);
+ return new Node(sz);
}
//-----------------------------copy_cvstate-----------------------------------
@@ -397,7 +397,7 @@
// Add required edge to oop_store, optimizer does not support precedence edges.
// Convert required edge to precedence edge before allocation.
- Node* st = new (C) StoreCMNode(ctl, mem, adr, adr_type, val, oop_store, oop_adr_idx);
+ Node* st = new StoreCMNode(ctl, mem, adr, adr_type, val, oop_store, oop_adr_idx);
st = transform(st);
set_memory(st, adr_idx);
@@ -497,7 +497,7 @@
uint adr_idx = C->get_alias_index(adr_type);
// Slow-path leaf call
- CallNode *call = (CallNode*)new (C) CallLeafNode( slow_call_type, slow_call, leaf_name, adr_type);
+ CallNode *call = (CallNode*)new CallLeafNode( slow_call_type, slow_call, leaf_name, adr_type);
// Set fixed predefined input arguments
call->init_req( TypeFunc::Control, ctrl() );
@@ -518,10 +518,10 @@
// Slow leaf call has no side-effects, sets few values
- set_ctrl(transform( new (C) ProjNode(call,TypeFunc::Control) ));
+ set_ctrl(transform( new ProjNode(call,TypeFunc::Control) ));
// Make memory for the call
- Node* mem = _gvn.transform( new (C) ProjNode(call, TypeFunc::Memory) );
+ Node* mem = _gvn.transform( new ProjNode(call, TypeFunc::Memory) );
// Set the RawPtr memory state only.
set_memory(mem, adr_idx);
@@ -544,7 +544,7 @@
uint adr_idx = C->get_alias_index(adr_type);
// Slow-path leaf call
- CallNode *call = (CallNode*)new (C) CallLeafNoFPNode( slow_call_type, slow_call, leaf_name, adr_type);
+ CallNode *call = (CallNode*)new CallLeafNoFPNode( slow_call_type, slow_call, leaf_name, adr_type);
// Set fixed predefined input arguments
call->init_req( TypeFunc::Control, ctrl() );
@@ -565,10 +565,10 @@
// Slow leaf call has no side-effects, sets few values
- set_ctrl(transform( new (C) ProjNode(call,TypeFunc::Control) ));
+ set_ctrl(transform( new ProjNode(call,TypeFunc::Control) ));
// Make memory for the call
- Node* mem = _gvn.transform( new (C) ProjNode(call, TypeFunc::Memory) );
+ Node* mem = _gvn.transform( new ProjNode(call, TypeFunc::Memory) );
// Set the RawPtr memory state only.
set_memory(mem, adr_idx);
--- a/hotspot/src/share/vm/opto/idealKit.hpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/idealKit.hpp Wed Jul 05 19:46:31 2017 +0200
@@ -173,43 +173,43 @@
void goto_(Node* lab, bool bind = false);
void declarations_done();
- Node* IfTrue(IfNode* iff) { return transform(new (C) IfTrueNode(iff)); }
- Node* IfFalse(IfNode* iff) { return transform(new (C) IfFalseNode(iff)); }
+ Node* IfTrue(IfNode* iff) { return transform(new IfTrueNode(iff)); }
+ Node* IfFalse(IfNode* iff) { return transform(new IfFalseNode(iff)); }
// Data
Node* ConI(jint k) { return (Node*)gvn().intcon(k); }
Node* makecon(const Type *t) const { return _gvn.makecon(t); }
- Node* AddI(Node* l, Node* r) { return transform(new (C) AddINode(l, r)); }
- Node* SubI(Node* l, Node* r) { return transform(new (C) SubINode(l, r)); }
- Node* AndI(Node* l, Node* r) { return transform(new (C) AndINode(l, r)); }
- Node* MaxI(Node* l, Node* r) { return transform(new (C) MaxINode(l, r)); }
- Node* LShiftI(Node* l, Node* r) { return transform(new (C) LShiftINode(l, r)); }
- Node* CmpI(Node* l, Node* r) { return transform(new (C) CmpINode(l, r)); }
- Node* Bool(Node* cmp, BoolTest::mask relop) { return transform(new (C) BoolNode(cmp, relop)); }
+ Node* AddI(Node* l, Node* r) { return transform(new AddINode(l, r)); }
+ Node* SubI(Node* l, Node* r) { return transform(new SubINode(l, r)); }
+ Node* AndI(Node* l, Node* r) { return transform(new AndINode(l, r)); }
+ Node* MaxI(Node* l, Node* r) { return transform(new MaxINode(l, r)); }
+ Node* LShiftI(Node* l, Node* r) { return transform(new LShiftINode(l, r)); }
+ Node* CmpI(Node* l, Node* r) { return transform(new CmpINode(l, r)); }
+ Node* Bool(Node* cmp, BoolTest::mask relop) { return transform(new BoolNode(cmp, relop)); }
void increment(IdealVariable& v, Node* j) { set(v, AddI(value(v), j)); }
void decrement(IdealVariable& v, Node* j) { set(v, SubI(value(v), j)); }
- Node* CmpL(Node* l, Node* r) { return transform(new (C) CmpLNode(l, r)); }
+ Node* CmpL(Node* l, Node* r) { return transform(new CmpLNode(l, r)); }
// TLS
- Node* thread() { return gvn().transform(new (C) ThreadLocalNode()); }
+ Node* thread() { return gvn().transform(new ThreadLocalNode()); }
// Pointers
// Raw address should be transformed regardless 'delay_transform' flag
// to produce canonical form CastX2P(offset).
- Node* AddP(Node *base, Node *ptr, Node *off) { return _gvn.transform(new (C) AddPNode(base, ptr, off)); }
+ Node* AddP(Node *base, Node *ptr, Node *off) { return _gvn.transform(new AddPNode(base, ptr, off)); }
- Node* CmpP(Node* l, Node* r) { return transform(new (C) CmpPNode(l, r)); }
+ Node* CmpP(Node* l, Node* r) { return transform(new CmpPNode(l, r)); }
#ifdef _LP64
- Node* XorX(Node* l, Node* r) { return transform(new (C) XorLNode(l, r)); }
+ Node* XorX(Node* l, Node* r) { return transform(new XorLNode(l, r)); }
#else // _LP64
- Node* XorX(Node* l, Node* r) { return transform(new (C) XorINode(l, r)); }
+ Node* XorX(Node* l, Node* r) { return transform(new XorINode(l, r)); }
#endif // _LP64
- Node* URShiftX(Node* l, Node* r) { return transform(new (C) URShiftXNode(l, r)); }
+ Node* URShiftX(Node* l, Node* r) { return transform(new URShiftXNode(l, r)); }
Node* ConX(jint k) { return (Node*)gvn().MakeConX(k); }
- Node* CastPX(Node* ctl, Node* p) { return transform(new (C) CastP2XNode(ctl, p)); }
+ Node* CastPX(Node* ctl, Node* p) { return transform(new CastP2XNode(ctl, p)); }
// Memory operations
--- a/hotspot/src/share/vm/opto/ifnode.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/ifnode.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -238,10 +238,10 @@
Node* predicate_x = NULL;
bool counted_loop = r->is_CountedLoop();
- Node *region_c = new (igvn->C) RegionNode(req_c + 1);
+ Node *region_c = new RegionNode(req_c + 1);
Node *phi_c = con1;
uint len = r->req();
- Node *region_x = new (igvn->C) RegionNode(len - req_c);
+ Node *region_x = new RegionNode(len - req_c);
Node *phi_x = PhiNode::make_blank(region_x, phi);
for (uint i = 1, i_c = 1, i_x = 1; i < len; i++) {
if (phi->in(i) == con1) {
@@ -272,7 +272,7 @@
// Prevent the untimely death of phi_x. Currently he has no uses. He is
// about to get one. If this only use goes away, then phi_x will look dead.
// However, he will be picking up some more uses down below.
- Node *hook = new (igvn->C) Node(4);
+ Node *hook = new Node(4);
hook->init_req(0, phi_x);
hook->init_req(1, phi_c);
phi_x = phase->transform( phi_x );
@@ -284,30 +284,30 @@
cmp_x->set_req(2,con2);
cmp_x = phase->transform(cmp_x);
// Make the bool
- Node *b_c = phase->transform(new (igvn->C) BoolNode(cmp_c,b->_test._test));
- Node *b_x = phase->transform(new (igvn->C) BoolNode(cmp_x,b->_test._test));
+ Node *b_c = phase->transform(new BoolNode(cmp_c,b->_test._test));
+ Node *b_x = phase->transform(new BoolNode(cmp_x,b->_test._test));
// Make the IfNode
- IfNode *iff_c = new (igvn->C) IfNode(region_c,b_c,iff->_prob,iff->_fcnt);
+ IfNode *iff_c = new IfNode(region_c,b_c,iff->_prob,iff->_fcnt);
igvn->set_type_bottom(iff_c);
igvn->_worklist.push(iff_c);
hook->init_req(2, iff_c);
- IfNode *iff_x = new (igvn->C) IfNode(region_x,b_x,iff->_prob, iff->_fcnt);
+ IfNode *iff_x = new IfNode(region_x,b_x,iff->_prob, iff->_fcnt);
igvn->set_type_bottom(iff_x);
igvn->_worklist.push(iff_x);
hook->init_req(3, iff_x);
// Make the true/false arms
- Node *iff_c_t = phase->transform(new (igvn->C) IfTrueNode (iff_c));
- Node *iff_c_f = phase->transform(new (igvn->C) IfFalseNode(iff_c));
+ Node *iff_c_t = phase->transform(new IfTrueNode (iff_c));
+ Node *iff_c_f = phase->transform(new IfFalseNode(iff_c));
if (predicate_c != NULL) {
assert(predicate_x == NULL, "only one predicate entry expected");
// Clone loop predicates to each path
iff_c_t = igvn->clone_loop_predicates(predicate_c, iff_c_t, !counted_loop);
iff_c_f = igvn->clone_loop_predicates(predicate_c, iff_c_f, !counted_loop);
}
- Node *iff_x_t = phase->transform(new (igvn->C) IfTrueNode (iff_x));
- Node *iff_x_f = phase->transform(new (igvn->C) IfFalseNode(iff_x));
+ Node *iff_x_t = phase->transform(new IfTrueNode (iff_x));
+ Node *iff_x_f = phase->transform(new IfFalseNode(iff_x));
if (predicate_x != NULL) {
assert(predicate_c == NULL, "only one predicate entry expected");
// Clone loop predicates to each path
@@ -316,14 +316,14 @@
}
// Merge the TRUE paths
- Node *region_s = new (igvn->C) RegionNode(3);
+ Node *region_s = new RegionNode(3);
igvn->_worklist.push(region_s);
region_s->init_req(1, iff_c_t);
region_s->init_req(2, iff_x_t);
igvn->register_new_node_with_optimizer( region_s );
// Merge the FALSE paths
- Node *region_f = new (igvn->C) RegionNode(3);
+ Node *region_f = new RegionNode(3);
igvn->_worklist.push(region_f);
region_f->init_req(1, iff_c_f);
region_f->init_req(2, iff_x_f);
@@ -438,7 +438,7 @@
// Must return either the original node (now dead) or a new node
// (Do not return a top here, since that would break the uniqueness of top.)
- return new (igvn->C) ConINode(TypeInt::ZERO);
+ return new ConINode(TypeInt::ZERO);
}
//------------------------------is_range_check---------------------------------
@@ -541,16 +541,16 @@
// Compute a new check
Node *new_add = gvn->intcon(off_lo);
if( index ) {
- new_add = off_lo ? gvn->transform(new (gvn->C) AddINode( index, new_add )) : index;
+ new_add = off_lo ? gvn->transform(new AddINode( index, new_add )) : index;
}
Node *new_cmp = (flip == 1)
- ? new (gvn->C) CmpUNode( new_add, range )
- : new (gvn->C) CmpUNode( range, new_add );
+ ? new CmpUNode( new_add, range )
+ : new CmpUNode( range, new_add );
new_cmp = gvn->transform(new_cmp);
// See if no need to adjust the existing check
if( new_cmp == cmp ) return;
// Else, adjust existing check
- Node *new_bol = gvn->transform( new (gvn->C) BoolNode( new_cmp, bol->as_Bool()->_test._test ) );
+ Node *new_bol = gvn->transform( new BoolNode( new_cmp, bol->as_Bool()->_test._test ) );
igvn->rehash_node_delayed( iff );
iff->set_req_X( 1, new_bol, igvn );
}
@@ -728,9 +728,9 @@
if (failtype->_hi != max_jint && failtype->_lo != min_jint && bound > 1) {
// Merge the two compares into a single unsigned compare by building (CmpU (n - lo) hi)
BoolTest::mask cond = fail->as_Proj()->_con ? BoolTest::lt : BoolTest::ge;
- Node* adjusted = phase->transform(new (phase->C) SubINode(n, phase->intcon(failtype->_lo)));
- Node* newcmp = phase->transform(new (phase->C) CmpUNode(adjusted, phase->intcon(bound)));
- Node* newbool = phase->transform(new (phase->C) BoolNode(newcmp, cond));
+ Node* adjusted = phase->transform(new SubINode(n, phase->intcon(failtype->_lo)));
+ Node* newcmp = phase->transform(new CmpUNode(adjusted, phase->intcon(bound)));
+ Node* newbool = phase->transform(new BoolNode(newcmp, cond));
phase->is_IterGVN()->replace_input_of(dom_iff, 1, phase->intcon(ctrl->as_Proj()->_con));
phase->hash_delete(this);
set_req(1, newbool);
@@ -1003,7 +1003,7 @@
// Must return either the original node (now dead) or a new node
// (Do not return a top here, since that would break the uniqueness of top.)
- return new (phase->C) ConINode(TypeInt::ZERO);
+ return new ConINode(TypeInt::ZERO);
}
//------------------------------dominated_by-----------------------------------
@@ -1099,7 +1099,7 @@
// Flip test to be canonical. Requires flipping the IfFalse/IfTrue and
// cloning the IfNode.
- Node* new_b = phase->transform( new (phase->C) BoolNode(b->in(1), bt.negate()) );
+ Node* new_b = phase->transform( new BoolNode(b->in(1), bt.negate()) );
if( !new_b->is_Bool() ) return NULL;
b = new_b->as_Bool();
@@ -1107,7 +1107,7 @@
assert( igvn, "Test is not canonical in parser?" );
// The IF node never really changes, but it needs to be cloned
- iff = new (phase->C) IfNode( iff->in(0), b, 1.0-iff->_prob, iff->_fcnt);
+ iff = new IfNode( iff->in(0), b, 1.0-iff->_prob, iff->_fcnt);
Node *prior = igvn->hash_find_insert(iff);
if( prior ) {
@@ -1120,8 +1120,8 @@
igvn->_worklist.push(iff);
// Now handle projections. Cloning not required.
- Node* new_if_f = (Node*)(new (phase->C) IfFalseNode( iff ));
- Node* new_if_t = (Node*)(new (phase->C) IfTrueNode ( iff ));
+ Node* new_if_f = (Node*)(new IfFalseNode( iff ));
+ Node* new_if_t = (Node*)(new IfTrueNode ( iff ));
igvn->register_new_node_with_optimizer(new_if_f);
igvn->register_new_node_with_optimizer(new_if_t);
--- a/hotspot/src/share/vm/opto/lcm.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/lcm.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -419,7 +419,7 @@
Node *tmp2 = block->get_node(block->end_idx()+2);
block->map_node(tmp2, block->end_idx()+1);
block->map_node(tmp1, block->end_idx()+2);
- Node *tmp = new (C) Node(C->top()); // Use not NULL input
+ Node *tmp = new Node(C->top()); // Use not NULL input
tmp1->replace_by(tmp);
tmp2->replace_by(tmp1);
tmp->replace_by(tmp2);
@@ -430,7 +430,7 @@
// Since schedule-local needs precise def-use info, we need to correct
// it as well.
Node *old_tst = proj->in(0);
- MachNode *nul_chk = new (C) MachNullCheckNode(old_tst->in(0),best,bidx);
+ MachNode *nul_chk = new MachNullCheckNode(old_tst->in(0),best,bidx);
block->map_node(nul_chk, block->end_idx());
map_node_to_block(nul_chk, block);
// Redirect users of old_test to nul_chk
@@ -671,7 +671,7 @@
// Set all registers killed and not already defined by the call.
uint r_cnt = mcall->tf()->range()->cnt();
int op = mcall->ideal_Opcode();
- MachProjNode *proj = new (C) MachProjNode( mcall, r_cnt+1, RegMask::Empty, MachProjNode::fat_proj );
+ MachProjNode *proj = new MachProjNode( mcall, r_cnt+1, RegMask::Empty, MachProjNode::fat_proj );
map_node_to_block(proj, block);
block->insert_node(proj, node_cnt++);
@@ -900,7 +900,7 @@
regs.Insert(_matcher.c_frame_pointer());
regs.OR(n->out_RegMask());
- MachProjNode *proj = new (C) MachProjNode( n, 1, RegMask::Empty, MachProjNode::fat_proj );
+ MachProjNode *proj = new MachProjNode( n, 1, RegMask::Empty, MachProjNode::fat_proj );
map_node_to_block(proj, block);
block->insert_node(proj, phi_cnt++);
--- a/hotspot/src/share/vm/opto/library_call.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/library_call.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -52,25 +52,28 @@
public:
private:
bool _is_virtual;
- bool _is_predicted;
bool _does_virtual_dispatch;
+ int8_t _predicates_count; // Intrinsic is predicated by several conditions
+ int8_t _last_predicate; // Last generated predicate
vmIntrinsics::ID _intrinsic_id;
public:
- LibraryIntrinsic(ciMethod* m, bool is_virtual, bool is_predicted, bool does_virtual_dispatch, vmIntrinsics::ID id)
+ LibraryIntrinsic(ciMethod* m, bool is_virtual, int predicates_count, bool does_virtual_dispatch, vmIntrinsics::ID id)
: InlineCallGenerator(m),
_is_virtual(is_virtual),
- _is_predicted(is_predicted),
_does_virtual_dispatch(does_virtual_dispatch),
+ _predicates_count((int8_t)predicates_count),
+ _last_predicate((int8_t)-1),
_intrinsic_id(id)
{
}
virtual bool is_intrinsic() const { return true; }
virtual bool is_virtual() const { return _is_virtual; }
- virtual bool is_predicted() const { return _is_predicted; }
+ virtual bool is_predicated() const { return _predicates_count > 0; }
+ virtual int predicates_count() const { return _predicates_count; }
virtual bool does_virtual_dispatch() const { return _does_virtual_dispatch; }
- virtual JVMState* generate(JVMState* jvms, Parse* parent_parser);
- virtual Node* generate_predicate(JVMState* jvms);
+ virtual JVMState* generate(JVMState* jvms);
+ virtual Node* generate_predicate(JVMState* jvms, int predicate);
vmIntrinsics::ID intrinsic_id() const { return _intrinsic_id; }
};
@@ -113,8 +116,8 @@
vmIntrinsics::ID intrinsic_id() const { return _intrinsic->intrinsic_id(); }
ciMethod* callee() const { return _intrinsic->method(); }
- bool try_to_inline();
- Node* try_to_predicate();
+ bool try_to_inline(int predicate);
+ Node* try_to_predicate(int predicate);
void push_result() {
// Push the result onto the stack.
@@ -313,6 +316,14 @@
Node* inline_cipherBlockChaining_AESCrypt_predicate(bool decrypting);
Node* get_key_start_from_aescrypt_object(Node* aescrypt_object);
Node* get_original_key_start_from_aescrypt_object(Node* aescrypt_object);
+ bool inline_sha_implCompress(vmIntrinsics::ID id);
+ bool inline_digestBase_implCompressMB(int predicate);
+ bool inline_sha_implCompressMB(Node* digestBaseObj, ciInstanceKlass* instklass_SHA,
+ bool long_state, address stubAddr, const char *stubName,
+ Node* src_start, Node* ofs, Node* limit);
+ Node* get_state_from_sha_object(Node *sha_object);
+ Node* get_state_from_sha5_object(Node *sha_object);
+ Node* inline_digestBase_implCompressMB_predicate(int predicate);
bool inline_encodeISOArray();
bool inline_updateCRC32();
bool inline_updateBytesCRC32();
@@ -373,7 +384,7 @@
}
}
- bool is_predicted = false;
+ int predicates = 0;
bool does_virtual_dispatch = false;
switch (id) {
@@ -513,7 +524,24 @@
case vmIntrinsics::_cipherBlockChaining_decryptAESCrypt:
if (!UseAESIntrinsics) return NULL;
// these two require the predicated logic
- is_predicted = true;
+ predicates = 1;
+ break;
+
+ case vmIntrinsics::_sha_implCompress:
+ if (!UseSHA1Intrinsics) return NULL;
+ break;
+
+ case vmIntrinsics::_sha2_implCompress:
+ if (!UseSHA256Intrinsics) return NULL;
+ break;
+
+ case vmIntrinsics::_sha5_implCompress:
+ if (!UseSHA512Intrinsics) return NULL;
+ break;
+
+ case vmIntrinsics::_digestBase_implCompressMB:
+ if (!(UseSHA1Intrinsics || UseSHA256Intrinsics || UseSHA512Intrinsics)) return NULL;
+ predicates = 3;
break;
case vmIntrinsics::_updateCRC32:
@@ -582,7 +610,7 @@
if (!InlineUnsafeOps) return NULL;
}
- return new LibraryIntrinsic(m, is_virtual, is_predicted, does_virtual_dispatch, (vmIntrinsics::ID) id);
+ return new LibraryIntrinsic(m, is_virtual, predicates, does_virtual_dispatch, (vmIntrinsics::ID) id);
}
//----------------------register_library_intrinsics-----------------------
@@ -591,7 +619,7 @@
// Nothing to do here.
}
-JVMState* LibraryIntrinsic::generate(JVMState* jvms, Parse* parent_parser) {
+JVMState* LibraryIntrinsic::generate(JVMState* jvms) {
LibraryCallKit kit(jvms, this);
Compile* C = kit.C;
int nodes = C->unique();
@@ -606,7 +634,7 @@
const int bci = kit.bci();
// Try to inline the intrinsic.
- if (kit.try_to_inline()) {
+ if (kit.try_to_inline(_last_predicate)) {
if (C->print_intrinsics() || C->print_inlining()) {
C->print_inlining(callee, jvms->depth() - 1, bci, is_virtual() ? "(intrinsic, virtual)" : "(intrinsic)");
}
@@ -641,12 +669,13 @@
return NULL;
}
-Node* LibraryIntrinsic::generate_predicate(JVMState* jvms) {
+Node* LibraryIntrinsic::generate_predicate(JVMState* jvms, int predicate) {
LibraryCallKit kit(jvms, this);
Compile* C = kit.C;
int nodes = C->unique();
+ _last_predicate = predicate;
#ifndef PRODUCT
- assert(is_predicted(), "sanity");
+ assert(is_predicated() && predicate < predicates_count(), "sanity");
if ((C->print_intrinsics() || C->print_inlining()) && Verbose) {
char buf[1000];
const char* str = vmIntrinsics::short_name_as_C_string(intrinsic_id(), buf, sizeof(buf));
@@ -656,10 +685,10 @@
ciMethod* callee = kit.callee();
const int bci = kit.bci();
- Node* slow_ctl = kit.try_to_predicate();
+ Node* slow_ctl = kit.try_to_predicate(predicate);
if (!kit.failing()) {
if (C->print_intrinsics() || C->print_inlining()) {
- C->print_inlining(callee, jvms->depth() - 1, bci, is_virtual() ? "(intrinsic, virtual)" : "(intrinsic)");
+ C->print_inlining(callee, jvms->depth() - 1, bci, is_virtual() ? "(intrinsic, virtual, predicate)" : "(intrinsic, predicate)");
}
C->gather_intrinsic_statistics(intrinsic_id(), is_virtual(), Compile::_intrinsic_worked);
if (C->log()) {
@@ -688,7 +717,7 @@
return NULL;
}
-bool LibraryCallKit::try_to_inline() {
+bool LibraryCallKit::try_to_inline(int predicate) {
// Handle symbolic names for otherwise undistinguished boolean switches:
const bool is_store = true;
const bool is_native_ptr = true;
@@ -882,6 +911,14 @@
case vmIntrinsics::_cipherBlockChaining_decryptAESCrypt:
return inline_cipherBlockChaining_AESCrypt(intrinsic_id());
+ case vmIntrinsics::_sha_implCompress:
+ case vmIntrinsics::_sha2_implCompress:
+ case vmIntrinsics::_sha5_implCompress:
+ return inline_sha_implCompress(intrinsic_id());
+
+ case vmIntrinsics::_digestBase_implCompressMB:
+ return inline_digestBase_implCompressMB(predicate);
+
case vmIntrinsics::_encodeISOArray:
return inline_encodeISOArray();
@@ -905,7 +942,7 @@
}
}
-Node* LibraryCallKit::try_to_predicate() {
+Node* LibraryCallKit::try_to_predicate(int predicate) {
if (!jvms()->has_method()) {
// Root JVMState has a null method.
assert(map()->memory()->Opcode() == Op_Parm, "");
@@ -919,6 +956,8 @@
return inline_cipherBlockChaining_AESCrypt_predicate(false);
case vmIntrinsics::_cipherBlockChaining_decryptAESCrypt:
return inline_cipherBlockChaining_AESCrypt_predicate(true);
+ case vmIntrinsics::_digestBase_implCompressMB:
+ return inline_digestBase_implCompressMB_predicate(predicate);
default:
// If you get here, it may be that someone has added a new intrinsic
@@ -969,7 +1008,7 @@
IfNode* iff = create_and_map_if(control(), test, true_prob, COUNT_UNKNOWN);
- Node* if_slow = _gvn.transform(new (C) IfTrueNode(iff));
+ Node* if_slow = _gvn.transform(new IfTrueNode(iff));
if (if_slow == top()) {
// The slow branch is never taken. No need to build this guard.
return NULL;
@@ -978,7 +1017,7 @@
if (region != NULL)
region->add_req(if_slow);
- Node* if_fast = _gvn.transform(new (C) IfFalseNode(iff));
+ Node* if_fast = _gvn.transform(new IfFalseNode(iff));
set_control(if_fast);
return if_slow;
@@ -997,12 +1036,12 @@
return NULL; // already stopped
if (_gvn.type(index)->higher_equal(TypeInt::POS)) // [0,maxint]
return NULL; // index is already adequately typed
- Node* cmp_lt = _gvn.transform(new (C) CmpINode(index, intcon(0)));
- Node* bol_lt = _gvn.transform(new (C) BoolNode(cmp_lt, BoolTest::lt));
+ Node* cmp_lt = _gvn.transform(new CmpINode(index, intcon(0)));
+ Node* bol_lt = _gvn.transform(new BoolNode(cmp_lt, BoolTest::lt));
Node* is_neg = generate_guard(bol_lt, region, PROB_MIN);
if (is_neg != NULL && pos_index != NULL) {
// Emulate effect of Parse::adjust_map_after_if.
- Node* ccast = new (C) CastIINode(index, TypeInt::POS);
+ Node* ccast = new CastIINode(index, TypeInt::POS);
ccast->set_req(0, control());
(*pos_index) = _gvn.transform(ccast);
}
@@ -1015,13 +1054,13 @@
return NULL; // already stopped
if (_gvn.type(index)->higher_equal(TypeInt::POS1)) // [1,maxint]
return NULL; // index is already adequately typed
- Node* cmp_le = _gvn.transform(new (C) CmpINode(index, intcon(0)));
+ Node* cmp_le = _gvn.transform(new CmpINode(index, intcon(0)));
BoolTest::mask le_or_eq = (never_negative ? BoolTest::eq : BoolTest::le);
- Node* bol_le = _gvn.transform(new (C) BoolNode(cmp_le, le_or_eq));
+ Node* bol_le = _gvn.transform(new BoolNode(cmp_le, le_or_eq));
Node* is_notp = generate_guard(bol_le, NULL, PROB_MIN);
if (is_notp != NULL && pos_index != NULL) {
// Emulate effect of Parse::adjust_map_after_if.
- Node* ccast = new (C) CastIINode(index, TypeInt::POS1);
+ Node* ccast = new CastIINode(index, TypeInt::POS1);
ccast->set_req(0, control());
(*pos_index) = _gvn.transform(ccast);
}
@@ -1053,9 +1092,9 @@
return NULL; // common case of whole-array copy
Node* last = subseq_length;
if (!zero_offset) // last += offset
- last = _gvn.transform(new (C) AddINode(last, offset));
- Node* cmp_lt = _gvn.transform(new (C) CmpUNode(array_length, last));
- Node* bol_lt = _gvn.transform(new (C) BoolNode(cmp_lt, BoolTest::lt));
+ last = _gvn.transform(new AddINode(last, offset));
+ Node* cmp_lt = _gvn.transform(new CmpUNode(array_length, last));
+ Node* bol_lt = _gvn.transform(new BoolNode(cmp_lt, BoolTest::lt));
Node* is_over = generate_guard(bol_lt, region, PROB_MIN);
return is_over;
}
@@ -1065,7 +1104,7 @@
Node* LibraryCallKit::generate_current_thread(Node* &tls_output) {
ciKlass* thread_klass = env()->Thread_klass();
const Type* thread_type = TypeOopPtr::make_from_klass(thread_klass)->cast_to_ptr_type(TypePtr::NotNull);
- Node* thread = _gvn.transform(new (C) ThreadLocalNode());
+ Node* thread = _gvn.transform(new ThreadLocalNode());
Node* p = basic_plus_adr(top()/*!oop*/, thread, in_bytes(JavaThread::threadObj_offset()));
Node* threadObj = make_load(NULL, p, thread_type, T_OBJECT, MemNode::unordered);
tls_output = thread;
@@ -1100,18 +1139,18 @@
// Get length of string 2
str2_len = load_String_length(no_ctrl, str2);
- result = new (C) StrIndexOfNode(control(), memory(TypeAryPtr::CHARS),
- str1_start, str1_len, str2_start, str2_len);
+ result = new StrIndexOfNode(control(), memory(TypeAryPtr::CHARS),
+ str1_start, str1_len, str2_start, str2_len);
break;
case Op_StrComp:
// Get length of string 2
str2_len = load_String_length(no_ctrl, str2);
- result = new (C) StrCompNode(control(), memory(TypeAryPtr::CHARS),
- str1_start, str1_len, str2_start, str2_len);
+ result = new StrCompNode(control(), memory(TypeAryPtr::CHARS),
+ str1_start, str1_len, str2_start, str2_len);
break;
case Op_StrEquals:
- result = new (C) StrEqualsNode(control(), memory(TypeAryPtr::CHARS),
+ result = new StrEqualsNode(control(), memory(TypeAryPtr::CHARS),
str1_start, str2_start, str1_len);
break;
default:
@@ -1133,16 +1172,16 @@
Node* result = NULL;
switch (opcode) {
case Op_StrIndexOf:
- result = new (C) StrIndexOfNode(control(), memory(TypeAryPtr::CHARS),
- str1_start, cnt1, str2_start, cnt2);
+ result = new StrIndexOfNode(control(), memory(TypeAryPtr::CHARS),
+ str1_start, cnt1, str2_start, cnt2);
break;
case Op_StrComp:
- result = new (C) StrCompNode(control(), memory(TypeAryPtr::CHARS),
- str1_start, cnt1, str2_start, cnt2);
+ result = new StrCompNode(control(), memory(TypeAryPtr::CHARS),
+ str1_start, cnt1, str2_start, cnt2);
break;
case Op_StrEquals:
- result = new (C) StrEqualsNode(control(), memory(TypeAryPtr::CHARS),
- str1_start, str2_start, cnt1);
+ result = new StrEqualsNode(control(), memory(TypeAryPtr::CHARS),
+ str1_start, str2_start, cnt1);
break;
default:
ShouldNotReachHere();
@@ -1178,12 +1217,12 @@
}
// paths (plus control) merge
- RegionNode* region = new (C) RegionNode(5);
- Node* phi = new (C) PhiNode(region, TypeInt::BOOL);
+ RegionNode* region = new RegionNode(5);
+ Node* phi = new PhiNode(region, TypeInt::BOOL);
// does source == target string?
- Node* cmp = _gvn.transform(new (C) CmpPNode(receiver, argument));
- Node* bol = _gvn.transform(new (C) BoolNode(cmp, BoolTest::eq));
+ Node* cmp = _gvn.transform(new CmpPNode(receiver, argument));
+ Node* bol = _gvn.transform(new BoolNode(cmp, BoolTest::eq));
Node* if_eq = generate_slow_guard(bol, NULL);
if (if_eq != NULL) {
@@ -1197,8 +1236,8 @@
if (!stopped()) {
Node* inst = gen_instanceof(argument, makecon(TypeKlassPtr::make(klass)));
- Node* cmp = _gvn.transform(new (C) CmpINode(inst, intcon(1)));
- Node* bol = _gvn.transform(new (C) BoolNode(cmp, BoolTest::ne));
+ Node* cmp = _gvn.transform(new CmpINode(inst, intcon(1)));
+ Node* bol = _gvn.transform(new BoolNode(cmp, BoolTest::ne));
Node* inst_false = generate_guard(bol, NULL, PROB_MIN);
//instanceOf == true, fallthrough
@@ -1213,7 +1252,7 @@
const TypeOopPtr* string_type = TypeOopPtr::make_from_klass(klass);
// Properly cast the argument to String
- argument = _gvn.transform(new (C) CheckCastPPNode(control(), argument, string_type));
+ argument = _gvn.transform(new CheckCastPPNode(control(), argument, string_type));
// This path is taken only when argument's type is String:NotNull.
argument = cast_not_null(argument, false);
@@ -1236,8 +1275,8 @@
Node* argument_cnt = load_String_length(no_ctrl, argument);
// Check for receiver count != argument count
- Node* cmp = _gvn.transform(new(C) CmpINode(receiver_cnt, argument_cnt));
- Node* bol = _gvn.transform(new(C) BoolNode(cmp, BoolTest::ne));
+ Node* cmp = _gvn.transform(new CmpINode(receiver_cnt, argument_cnt));
+ Node* bol = _gvn.transform(new BoolNode(cmp, BoolTest::ne));
Node* if_ne = generate_slow_guard(bol, NULL);
if (if_ne != NULL) {
phi->init_req(4, intcon(0));
@@ -1265,7 +1304,7 @@
bool LibraryCallKit::inline_array_equals() {
Node* arg1 = argument(0);
Node* arg2 = argument(1);
- set_result(_gvn.transform(new (C) AryEqNode(control(), memory(TypeAryPtr::CHARS), arg1, arg2)));
+ set_result(_gvn.transform(new AryEqNode(control(), memory(TypeAryPtr::CHARS), arg1, arg2)));
return true;
}
@@ -1434,8 +1473,8 @@
const TypeOopPtr* string_type = TypeOopPtr::make_from_klass(str_klass);
// Make the merge point
- RegionNode* result_rgn = new (C) RegionNode(4);
- Node* result_phi = new (C) PhiNode(result_rgn, TypeInt::INT);
+ RegionNode* result_rgn = new RegionNode(4);
+ Node* result_phi = new PhiNode(result_rgn, TypeInt::INT);
Node* no_ctrl = NULL;
// Get start addr of source string
@@ -1455,8 +1494,8 @@
Node* substr_cnt = load_String_length(no_ctrl, arg);
// Check for substr count > string count
- Node* cmp = _gvn.transform(new(C) CmpINode(substr_cnt, source_cnt));
- Node* bol = _gvn.transform(new(C) BoolNode(cmp, BoolTest::gt));
+ Node* cmp = _gvn.transform(new CmpINode(substr_cnt, source_cnt));
+ Node* bol = _gvn.transform(new BoolNode(cmp, BoolTest::gt));
Node* if_gt = generate_slow_guard(bol, NULL);
if (if_gt != NULL) {
result_phi->init_req(2, intcon(-1));
@@ -1465,8 +1504,8 @@
if (!stopped()) {
// Check for substr count == 0
- cmp = _gvn.transform(new(C) CmpINode(substr_cnt, intcon(0)));
- bol = _gvn.transform(new(C) BoolNode(cmp, BoolTest::eq));
+ cmp = _gvn.transform(new CmpINode(substr_cnt, intcon(0)));
+ bol = _gvn.transform(new BoolNode(cmp, BoolTest::eq));
Node* if_zero = generate_slow_guard(bol, NULL);
if (if_zero != NULL) {
result_phi->init_req(3, intcon(0));
@@ -1558,7 +1597,7 @@
// Round a double node if necessary.
Node* LibraryCallKit::round_double_node(Node* n) {
if (Matcher::strict_fp_requires_explicit_rounding && UseSSE <= 1)
- n = _gvn.transform(new (C) RoundDoubleNode(0, n));
+ n = _gvn.transform(new RoundDoubleNode(0, n));
return n;
}
@@ -1571,10 +1610,10 @@
Node* arg = round_double_node(argument(0));
Node* n;
switch (id) {
- case vmIntrinsics::_dabs: n = new (C) AbsDNode( arg); break;
- case vmIntrinsics::_dsqrt: n = new (C) SqrtDNode(C, control(), arg); break;
- case vmIntrinsics::_dlog: n = new (C) LogDNode(C, control(), arg); break;
- case vmIntrinsics::_dlog10: n = new (C) Log10DNode(C, control(), arg); break;
+ case vmIntrinsics::_dabs: n = new AbsDNode( arg); break;
+ case vmIntrinsics::_dsqrt: n = new SqrtDNode(C, control(), arg); break;
+ case vmIntrinsics::_dlog: n = new LogDNode(C, control(), arg); break;
+ case vmIntrinsics::_dlog10: n = new Log10DNode(C, control(), arg); break;
default: fatal_unexpected_iid(id); break;
}
set_result(_gvn.transform(n));
@@ -1589,9 +1628,9 @@
Node* n = NULL;
switch (id) {
- case vmIntrinsics::_dsin: n = new (C) SinDNode(C, control(), arg); break;
- case vmIntrinsics::_dcos: n = new (C) CosDNode(C, control(), arg); break;
- case vmIntrinsics::_dtan: n = new (C) TanDNode(C, control(), arg); break;
+ case vmIntrinsics::_dsin: n = new SinDNode(C, control(), arg); break;
+ case vmIntrinsics::_dcos: n = new CosDNode(C, control(), arg); break;
+ case vmIntrinsics::_dtan: n = new TanDNode(C, control(), arg); break;
default: fatal_unexpected_iid(id); break;
}
n = _gvn.transform(n);
@@ -1632,17 +1671,17 @@
// probably do the math inside the SIN encoding.
// Make the merge point
- RegionNode* r = new (C) RegionNode(3);
- Node* phi = new (C) PhiNode(r, Type::DOUBLE);
+ RegionNode* r = new RegionNode(3);
+ Node* phi = new PhiNode(r, Type::DOUBLE);
// Flatten arg so we need only 1 test
- Node *abs = _gvn.transform(new (C) AbsDNode(arg));
+ Node *abs = _gvn.transform(new AbsDNode(arg));
// Node for PI/4 constant
Node *pi4 = makecon(TypeD::make(pi_4));
// Check PI/4 : abs(arg)
- Node *cmp = _gvn.transform(new (C) CmpDNode(pi4,abs));
+ Node *cmp = _gvn.transform(new CmpDNode(pi4,abs));
// Check: If PI/4 < abs(arg) then go slow
- Node *bol = _gvn.transform(new (C) BoolNode( cmp, BoolTest::lt ));
+ Node *bol = _gvn.transform(new BoolNode( cmp, BoolTest::lt ));
// Branch either way
IfNode *iff = create_and_xform_if(control(),bol, PROB_STATIC_FREQUENT, COUNT_UNKNOWN);
set_control(opt_iff(r,iff));
@@ -1670,7 +1709,7 @@
break;
}
assert(control()->in(0) == call, "");
- Node* slow_result = _gvn.transform(new (C) ProjNode(call, TypeFunc::Parms));
+ Node* slow_result = _gvn.transform(new ProjNode(call, TypeFunc::Parms));
r->init_req(1, control());
phi->init_req(1, slow_result);
@@ -1690,9 +1729,9 @@
//result=(result.isNaN())? funcAddr():result;
// Check: If isNaN() by checking result!=result? then either trap
// or go to runtime
- Node* cmpisnan = _gvn.transform(new (C) CmpDNode(result, result));
+ Node* cmpisnan = _gvn.transform(new CmpDNode(result, result));
// Build the boolean node
- Node* bolisnum = _gvn.transform(new (C) BoolNode(cmpisnan, BoolTest::eq));
+ Node* bolisnum = _gvn.transform(new BoolNode(cmpisnan, BoolTest::eq));
if (!too_many_traps(Deoptimization::Reason_intrinsic)) {
{ BuildCutout unless(this, bolisnum, PROB_STATIC_FREQUENT);
@@ -1707,12 +1746,12 @@
// to the runtime to properly handle corner cases
IfNode* iff = create_and_xform_if(control(), bolisnum, PROB_STATIC_FREQUENT, COUNT_UNKNOWN);
- Node* if_slow = _gvn.transform(new (C) IfFalseNode(iff));
- Node* if_fast = _gvn.transform(new (C) IfTrueNode(iff));
+ Node* if_slow = _gvn.transform(new IfFalseNode(iff));
+ Node* if_fast = _gvn.transform(new IfTrueNode(iff));
if (!if_slow->is_top()) {
- RegionNode* result_region = new (C) RegionNode(3);
- PhiNode* result_val = new (C) PhiNode(result_region, Type::DOUBLE);
+ RegionNode* result_region = new RegionNode(3);
+ PhiNode* result_val = new PhiNode(result_region, Type::DOUBLE);
result_region->init_req(1, if_fast);
result_val->init_req(1, result);
@@ -1723,9 +1762,9 @@
Node* rt = make_runtime_call(RC_LEAF, call_type, funcAddr, funcName,
no_memory_effects,
x, top(), y, y ? top() : NULL);
- Node* value = _gvn.transform(new (C) ProjNode(rt, TypeFunc::Parms+0));
+ Node* value = _gvn.transform(new ProjNode(rt, TypeFunc::Parms+0));
#ifdef ASSERT
- Node* value_top = _gvn.transform(new (C) ProjNode(rt, TypeFunc::Parms+1));
+ Node* value_top = _gvn.transform(new ProjNode(rt, TypeFunc::Parms+1));
assert(value_top == top(), "second value must be top");
#endif
@@ -1744,7 +1783,7 @@
// really odd corner cases (+/- Infinity). Just uncommon-trap them.
bool LibraryCallKit::inline_exp() {
Node* arg = round_double_node(argument(0));
- Node* n = _gvn.transform(new (C) ExpDNode(C, control(), arg));
+ Node* n = _gvn.transform(new ExpDNode(C, control(), arg));
n = finish_pow_exp(n, arg, NULL, OptoRuntime::Math_D_D_Type(), CAST_FROM_FN_PTR(address, SharedRuntime::dexp), "EXP");
set_result(n);
@@ -1783,76 +1822,76 @@
Node* result = NULL;
Node* const_two_node = makecon(TypeD::make(2.0));
- Node* cmp_node = _gvn.transform(new (C) CmpDNode(y, const_two_node));
- Node* bool_node = _gvn.transform(new (C) BoolNode(cmp_node, BoolTest::eq));
+ Node* cmp_node = _gvn.transform(new CmpDNode(y, const_two_node));
+ Node* bool_node = _gvn.transform(new BoolNode(cmp_node, BoolTest::eq));
IfNode* if_node = create_and_xform_if(control(), bool_node, PROB_STATIC_INFREQUENT, COUNT_UNKNOWN);
- Node* if_true = _gvn.transform(new (C) IfTrueNode(if_node));
- Node* if_false = _gvn.transform(new (C) IfFalseNode(if_node));
-
- RegionNode* region_node = new (C) RegionNode(3);
+ Node* if_true = _gvn.transform(new IfTrueNode(if_node));
+ Node* if_false = _gvn.transform(new IfFalseNode(if_node));
+
+ RegionNode* region_node = new RegionNode(3);
region_node->init_req(1, if_true);
- Node* phi_node = new (C) PhiNode(region_node, Type::DOUBLE);
+ Node* phi_node = new PhiNode(region_node, Type::DOUBLE);
// special case for x^y where y == 2, we can convert it to x * x
- phi_node->init_req(1, _gvn.transform(new (C) MulDNode(x, x)));
+ phi_node->init_req(1, _gvn.transform(new MulDNode(x, x)));
// set control to if_false since we will now process the false branch
set_control(if_false);
if (!too_many_traps(Deoptimization::Reason_intrinsic)) {
// Short form: skip the fancy tests and just check for NaN result.
- result = _gvn.transform(new (C) PowDNode(C, control(), x, y));
+ result = _gvn.transform(new PowDNode(C, control(), x, y));
} else {
// If this inlining ever returned NaN in the past, include all
// checks + call to the runtime.
// Set the merge point for If node with condition of (x <= 0.0)
// There are four possible paths to region node and phi node
- RegionNode *r = new (C) RegionNode(4);
- Node *phi = new (C) PhiNode(r, Type::DOUBLE);
+ RegionNode *r = new RegionNode(4);
+ Node *phi = new PhiNode(r, Type::DOUBLE);
// Build the first if node: if (x <= 0.0)
// Node for 0 constant
Node *zeronode = makecon(TypeD::ZERO);
// Check x:0
- Node *cmp = _gvn.transform(new (C) CmpDNode(x, zeronode));
+ Node *cmp = _gvn.transform(new CmpDNode(x, zeronode));
// Check: If (x<=0) then go complex path
- Node *bol1 = _gvn.transform(new (C) BoolNode( cmp, BoolTest::le ));
+ Node *bol1 = _gvn.transform(new BoolNode( cmp, BoolTest::le ));
// Branch either way
IfNode *if1 = create_and_xform_if(control(),bol1, PROB_STATIC_INFREQUENT, COUNT_UNKNOWN);
// Fast path taken; set region slot 3
- Node *fast_taken = _gvn.transform(new (C) IfFalseNode(if1));
+ Node *fast_taken = _gvn.transform(new IfFalseNode(if1));
r->init_req(3,fast_taken); // Capture fast-control
// Fast path not-taken, i.e. slow path
- Node *complex_path = _gvn.transform(new (C) IfTrueNode(if1));
+ Node *complex_path = _gvn.transform(new IfTrueNode(if1));
// Set fast path result
- Node *fast_result = _gvn.transform(new (C) PowDNode(C, control(), x, y));
+ Node *fast_result = _gvn.transform(new PowDNode(C, control(), x, y));
phi->init_req(3, fast_result);
// Complex path
// Build the second if node (if y is long)
// Node for (long)y
- Node *longy = _gvn.transform(new (C) ConvD2LNode(y));
+ Node *longy = _gvn.transform(new ConvD2LNode(y));
// Node for (double)((long) y)
- Node *doublelongy= _gvn.transform(new (C) ConvL2DNode(longy));
+ Node *doublelongy= _gvn.transform(new ConvL2DNode(longy));
// Check (double)((long) y) : y
- Node *cmplongy= _gvn.transform(new (C) CmpDNode(doublelongy, y));
+ Node *cmplongy= _gvn.transform(new CmpDNode(doublelongy, y));
// Check if (y isn't long) then go to slow path
- Node *bol2 = _gvn.transform(new (C) BoolNode( cmplongy, BoolTest::ne ));
+ Node *bol2 = _gvn.transform(new BoolNode( cmplongy, BoolTest::ne ));
// Branch either way
IfNode *if2 = create_and_xform_if(complex_path,bol2, PROB_STATIC_INFREQUENT, COUNT_UNKNOWN);
- Node* ylong_path = _gvn.transform(new (C) IfFalseNode(if2));
-
- Node *slow_path = _gvn.transform(new (C) IfTrueNode(if2));
+ Node* ylong_path = _gvn.transform(new IfFalseNode(if2));
+
+ Node *slow_path = _gvn.transform(new IfTrueNode(if2));
// Calculate DPow(abs(x), y)*(1 & (long)y)
// Node for constant 1
Node *conone = longcon(1);
// 1& (long)y
- Node *signnode= _gvn.transform(new (C) AndLNode(conone, longy));
+ Node *signnode= _gvn.transform(new AndLNode(conone, longy));
// A huge number is always even. Detect a huge number by checking
// if y + 1 == y and set integer to be tested for parity to 0.
@@ -1860,18 +1899,18 @@
// (long)9.223372036854776E18 = max_jlong
// (double)(long)9.223372036854776E18 = 9.223372036854776E18
// max_jlong is odd but 9.223372036854776E18 is even
- Node* yplus1 = _gvn.transform(new (C) AddDNode(y, makecon(TypeD::make(1))));
- Node *cmpyplus1= _gvn.transform(new (C) CmpDNode(yplus1, y));
- Node *bolyplus1 = _gvn.transform(new (C) BoolNode( cmpyplus1, BoolTest::eq ));
+ Node* yplus1 = _gvn.transform(new AddDNode(y, makecon(TypeD::make(1))));
+ Node *cmpyplus1= _gvn.transform(new CmpDNode(yplus1, y));
+ Node *bolyplus1 = _gvn.transform(new BoolNode( cmpyplus1, BoolTest::eq ));
Node* correctedsign = NULL;
if (ConditionalMoveLimit != 0) {
correctedsign = _gvn.transform( CMoveNode::make(C, NULL, bolyplus1, signnode, longcon(0), TypeLong::LONG));
} else {
IfNode *ifyplus1 = create_and_xform_if(ylong_path,bolyplus1, PROB_FAIR, COUNT_UNKNOWN);
- RegionNode *r = new (C) RegionNode(3);
- Node *phi = new (C) PhiNode(r, TypeLong::LONG);
- r->init_req(1, _gvn.transform(new (C) IfFalseNode(ifyplus1)));
- r->init_req(2, _gvn.transform(new (C) IfTrueNode(ifyplus1)));
+ RegionNode *r = new RegionNode(3);
+ Node *phi = new PhiNode(r, TypeLong::LONG);
+ r->init_req(1, _gvn.transform(new IfFalseNode(ifyplus1)));
+ r->init_req(2, _gvn.transform(new IfTrueNode(ifyplus1)));
phi->init_req(1, signnode);
phi->init_req(2, longcon(0));
correctedsign = _gvn.transform(phi);
@@ -1882,25 +1921,25 @@
// zero node
Node *conzero = longcon(0);
// Check (1&(long)y)==0?
- Node *cmpeq1 = _gvn.transform(new (C) CmpLNode(correctedsign, conzero));
+ Node *cmpeq1 = _gvn.transform(new CmpLNode(correctedsign, conzero));
// Check if (1&(long)y)!=0?, if so the result is negative
- Node *bol3 = _gvn.transform(new (C) BoolNode( cmpeq1, BoolTest::ne ));
+ Node *bol3 = _gvn.transform(new BoolNode( cmpeq1, BoolTest::ne ));
// abs(x)
- Node *absx=_gvn.transform(new (C) AbsDNode(x));
+ Node *absx=_gvn.transform(new AbsDNode(x));
// abs(x)^y
- Node *absxpowy = _gvn.transform(new (C) PowDNode(C, control(), absx, y));
+ Node *absxpowy = _gvn.transform(new PowDNode(C, control(), absx, y));
// -abs(x)^y
- Node *negabsxpowy = _gvn.transform(new (C) NegDNode (absxpowy));
+ Node *negabsxpowy = _gvn.transform(new NegDNode (absxpowy));
// (1&(long)y)==1?-DPow(abs(x), y):DPow(abs(x), y)
Node *signresult = NULL;
if (ConditionalMoveLimit != 0) {
signresult = _gvn.transform( CMoveNode::make(C, NULL, bol3, absxpowy, negabsxpowy, Type::DOUBLE));
} else {
IfNode *ifyeven = create_and_xform_if(ylong_path,bol3, PROB_FAIR, COUNT_UNKNOWN);
- RegionNode *r = new (C) RegionNode(3);
- Node *phi = new (C) PhiNode(r, Type::DOUBLE);
- r->init_req(1, _gvn.transform(new (C) IfFalseNode(ifyeven)));
- r->init_req(2, _gvn.transform(new (C) IfTrueNode(ifyeven)));
+ RegionNode *r = new RegionNode(3);
+ Node *phi = new PhiNode(r, Type::DOUBLE);
+ r->init_req(1, _gvn.transform(new IfFalseNode(ifyeven)));
+ r->init_req(2, _gvn.transform(new IfTrueNode(ifyeven)));
phi->init_req(1, absxpowy);
phi->init_req(2, negabsxpowy);
signresult = _gvn.transform(phi);
@@ -1949,9 +1988,9 @@
Node* trig = make_runtime_call(RC_LEAF, call_type, funcAddr, funcName,
no_memory_effects,
a, top(), b, b ? top() : NULL);
- Node* value = _gvn.transform(new (C) ProjNode(trig, TypeFunc::Parms+0));
+ Node* value = _gvn.transform(new ProjNode(trig, TypeFunc::Parms+0));
#ifdef ASSERT
- Node* value_top = _gvn.transform(new (C) ProjNode(trig, TypeFunc::Parms+1));
+ Node* value_top = _gvn.transform(new ProjNode(trig, TypeFunc::Parms+1));
assert(value_top == top(), "second value must be top");
#endif
@@ -2011,10 +2050,10 @@
}
void LibraryCallKit::inline_math_mathExact(Node* math, Node *test) {
- Node* bol = _gvn.transform( new (C) BoolNode(test, BoolTest::overflow) );
+ Node* bol = _gvn.transform( new BoolNode(test, BoolTest::overflow) );
IfNode* check = create_and_map_if(control(), bol, PROB_UNLIKELY_MAG(3), COUNT_UNKNOWN);
- Node* fast_path = _gvn.transform( new (C) IfFalseNode(check));
- Node* slow_path = _gvn.transform( new (C) IfTrueNode(check) );
+ Node* fast_path = _gvn.transform( new IfFalseNode(check));
+ Node* slow_path = _gvn.transform( new IfTrueNode(check) );
{
PreserveJVMState pjvms(this);
@@ -2036,9 +2075,9 @@
bool LibraryCallKit::inline_math_overflow(Node* arg1, Node* arg2) {
typedef typename OverflowOp::MathOp MathOp;
- MathOp* mathOp = new(C) MathOp(arg1, arg2);
+ MathOp* mathOp = new MathOp(arg1, arg2);
Node* operation = _gvn.transform( mathOp );
- Node* ofcheck = _gvn.transform( new(C) OverflowOp(arg1, arg2) );
+ Node* ofcheck = _gvn.transform( new OverflowOp(arg1, arg2) );
inline_math_mathExact(operation, ofcheck);
return true;
}
@@ -2106,7 +2145,7 @@
int cmp_op = Op_CmpI;
Node* xkey = xvalue;
Node* ykey = yvalue;
- Node* ideal_cmpxy = _gvn.transform(new(C) CmpINode(xkey, ykey));
+ Node* ideal_cmpxy = _gvn.transform(new CmpINode(xkey, ykey));
if (ideal_cmpxy->is_Cmp()) {
// E.g., if we have CmpI(length - offset, count),
// it might idealize to CmpI(length, count + offset)
@@ -2199,7 +2238,7 @@
default:
if (cmpxy == NULL)
cmpxy = ideal_cmpxy;
- best_bol = _gvn.transform(new(C) BoolNode(cmpxy, BoolTest::lt));
+ best_bol = _gvn.transform(new BoolNode(cmpxy, BoolTest::lt));
// and fall through:
case BoolTest::lt: // x < y
case BoolTest::le: // x <= y
@@ -2259,7 +2298,7 @@
return Type::AnyPtr;
} else if (base_type == TypePtr::NULL_PTR) {
// Since this is a NULL+long form, we have to switch to a rawptr.
- base = _gvn.transform(new (C) CastX2PNode(offset));
+ base = _gvn.transform(new CastX2PNode(offset));
offset = MakeConX(0);
return Type::RawPtr;
} else if (base_type->base() == Type::RawPtr) {
@@ -2312,16 +2351,16 @@
Node* arg = argument(0);
Node* n;
switch (id) {
- case vmIntrinsics::_numberOfLeadingZeros_i: n = new (C) CountLeadingZerosINode( arg); break;
- case vmIntrinsics::_numberOfLeadingZeros_l: n = new (C) CountLeadingZerosLNode( arg); break;
- case vmIntrinsics::_numberOfTrailingZeros_i: n = new (C) CountTrailingZerosINode(arg); break;
- case vmIntrinsics::_numberOfTrailingZeros_l: n = new (C) CountTrailingZerosLNode(arg); break;
- case vmIntrinsics::_bitCount_i: n = new (C) PopCountINode( arg); break;
- case vmIntrinsics::_bitCount_l: n = new (C) PopCountLNode( arg); break;
- case vmIntrinsics::_reverseBytes_c: n = new (C) ReverseBytesUSNode(0, arg); break;
- case vmIntrinsics::_reverseBytes_s: n = new (C) ReverseBytesSNode( 0, arg); break;
- case vmIntrinsics::_reverseBytes_i: n = new (C) ReverseBytesINode( 0, arg); break;
- case vmIntrinsics::_reverseBytes_l: n = new (C) ReverseBytesLNode( 0, arg); break;
+ case vmIntrinsics::_numberOfLeadingZeros_i: n = new CountLeadingZerosINode( arg); break;
+ case vmIntrinsics::_numberOfLeadingZeros_l: n = new CountLeadingZerosLNode( arg); break;
+ case vmIntrinsics::_numberOfTrailingZeros_i: n = new CountTrailingZerosINode(arg); break;
+ case vmIntrinsics::_numberOfTrailingZeros_l: n = new CountTrailingZerosLNode(arg); break;
+ case vmIntrinsics::_bitCount_i: n = new PopCountINode( arg); break;
+ case vmIntrinsics::_bitCount_l: n = new PopCountLNode( arg); break;
+ case vmIntrinsics::_reverseBytes_c: n = new ReverseBytesUSNode(0, arg); break;
+ case vmIntrinsics::_reverseBytes_s: n = new ReverseBytesSNode( 0, arg); break;
+ case vmIntrinsics::_reverseBytes_i: n = new ReverseBytesINode( 0, arg); break;
+ case vmIntrinsics::_reverseBytes_l: n = new ReverseBytesLNode( 0, arg); break;
default: fatal_unexpected_iid(id); break;
}
set_result(_gvn.transform(n));
@@ -2637,7 +2676,7 @@
break;
case T_ADDRESS:
// Cast to an int type.
- p = _gvn.transform(new (C) CastP2XNode(NULL, p));
+ p = _gvn.transform(new CastP2XNode(NULL, p));
p = ConvX2UL(p);
break;
default:
@@ -2658,7 +2697,7 @@
case T_ADDRESS:
// Repackage the long as a pointer.
val = ConvL2X(val);
- val = _gvn.transform(new (C) CastX2PNode(val));
+ val = _gvn.transform(new CastX2PNode(val));
break;
}
@@ -2766,9 +2805,9 @@
// Generate the read or write prefetch
Node *prefetch;
if (is_store) {
- prefetch = new (C) PrefetchWriteNode(i_o(), adr);
+ prefetch = new PrefetchWriteNode(i_o(), adr);
} else {
- prefetch = new (C) PrefetchReadNode(i_o(), adr);
+ prefetch = new PrefetchReadNode(i_o(), adr);
}
prefetch->init_req(0, control());
set_i_o(_gvn.transform(prefetch));
@@ -2906,22 +2945,22 @@
switch(type) {
case T_INT:
if (kind == LS_xadd) {
- load_store = _gvn.transform(new (C) GetAndAddINode(control(), mem, adr, newval, adr_type));
+ load_store = _gvn.transform(new GetAndAddINode(control(), mem, adr, newval, adr_type));
} else if (kind == LS_xchg) {
- load_store = _gvn.transform(new (C) GetAndSetINode(control(), mem, adr, newval, adr_type));
+ load_store = _gvn.transform(new GetAndSetINode(control(), mem, adr, newval, adr_type));
} else if (kind == LS_cmpxchg) {
- load_store = _gvn.transform(new (C) CompareAndSwapINode(control(), mem, adr, newval, oldval));
+ load_store = _gvn.transform(new CompareAndSwapINode(control(), mem, adr, newval, oldval));
} else {
ShouldNotReachHere();
}
break;
case T_LONG:
if (kind == LS_xadd) {
- load_store = _gvn.transform(new (C) GetAndAddLNode(control(), mem, adr, newval, adr_type));
+ load_store = _gvn.transform(new GetAndAddLNode(control(), mem, adr, newval, adr_type));
} else if (kind == LS_xchg) {
- load_store = _gvn.transform(new (C) GetAndSetLNode(control(), mem, adr, newval, adr_type));
+ load_store = _gvn.transform(new GetAndSetLNode(control(), mem, adr, newval, adr_type));
} else if (kind == LS_cmpxchg) {
- load_store = _gvn.transform(new (C) CompareAndSwapLNode(control(), mem, adr, newval, oldval));
+ load_store = _gvn.transform(new CompareAndSwapLNode(control(), mem, adr, newval, oldval));
} else {
ShouldNotReachHere();
}
@@ -2958,24 +2997,24 @@
#ifdef _LP64
if (adr->bottom_type()->is_ptr_to_narrowoop()) {
- Node *newval_enc = _gvn.transform(new (C) EncodePNode(newval, newval->bottom_type()->make_narrowoop()));
+ Node *newval_enc = _gvn.transform(new EncodePNode(newval, newval->bottom_type()->make_narrowoop()));
if (kind == LS_xchg) {
- load_store = _gvn.transform(new (C) GetAndSetNNode(control(), mem, adr,
- newval_enc, adr_type, value_type->make_narrowoop()));
+ load_store = _gvn.transform(new GetAndSetNNode(control(), mem, adr,
+ newval_enc, adr_type, value_type->make_narrowoop()));
} else {
assert(kind == LS_cmpxchg, "wrong LoadStore operation");
- Node *oldval_enc = _gvn.transform(new (C) EncodePNode(oldval, oldval->bottom_type()->make_narrowoop()));
- load_store = _gvn.transform(new (C) CompareAndSwapNNode(control(), mem, adr,
+ Node *oldval_enc = _gvn.transform(new EncodePNode(oldval, oldval->bottom_type()->make_narrowoop()));
+ load_store = _gvn.transform(new CompareAndSwapNNode(control(), mem, adr,
newval_enc, oldval_enc));
}
} else
#endif
{
if (kind == LS_xchg) {
- load_store = _gvn.transform(new (C) GetAndSetPNode(control(), mem, adr, newval, adr_type, value_type->is_oopptr()));
+ load_store = _gvn.transform(new GetAndSetPNode(control(), mem, adr, newval, adr_type, value_type->is_oopptr()));
} else {
assert(kind == LS_cmpxchg, "wrong LoadStore operation");
- load_store = _gvn.transform(new (C) CompareAndSwapPNode(control(), mem, adr, newval, oldval));
+ load_store = _gvn.transform(new CompareAndSwapPNode(control(), mem, adr, newval, oldval));
}
}
post_barrier(control(), load_store, base, adr, alias_idx, newval, T_OBJECT, true);
@@ -2988,13 +3027,13 @@
// SCMemProjNodes represent the memory state of a LoadStore. Their
// main role is to prevent LoadStore nodes from being optimized away
// when their results aren't used.
- Node* proj = _gvn.transform(new (C) SCMemProjNode(load_store));
+ Node* proj = _gvn.transform(new SCMemProjNode(load_store));
set_memory(proj, alias_idx);
if (type == T_OBJECT && kind == LS_xchg) {
#ifdef _LP64
if (adr->bottom_type()->is_ptr_to_narrowoop()) {
- load_store = _gvn.transform(new (C) DecodeNNode(load_store, load_store->get_ptr_type()));
+ load_store = _gvn.transform(new DecodeNNode(load_store, load_store->get_ptr_type()));
}
#endif
if (can_move_pre_barrier()) {
@@ -3136,7 +3175,7 @@
// can generate code to load it as unsigned byte.
Node* inst = make_load(NULL, insp, TypeInt::UBYTE, T_BOOLEAN, MemNode::unordered);
Node* bits = intcon(InstanceKlass::fully_initialized);
- test = _gvn.transform(new (C) SubINode(inst, bits));
+ test = _gvn.transform(new SubINode(inst, bits));
// The 'test' is non-zero if we need to take a slow path.
}
@@ -3160,9 +3199,9 @@
Node* insp = basic_plus_adr(kls, in_bytes(offset));
Node* tvalue = make_load(NULL, insp, TypeLong::LONG, T_LONG, MemNode::unordered);
Node* bits = longcon(~0x03l); // ignore bit 0 & 1
- Node* andl = _gvn.transform(new (C) AndLNode(tvalue, bits));
+ Node* andl = _gvn.transform(new AndLNode(tvalue, bits));
Node* clsused = longcon(0x01l); // set the class bit
- Node* orl = _gvn.transform(new (C) OrLNode(tvalue, clsused));
+ Node* orl = _gvn.transform(new OrLNode(tvalue, clsused));
const TypePtr *adr_type = _gvn.type(insp)->isa_ptr();
store_to_memory(control(), insp, orl, T_LONG, adr_type, MemNode::unordered);
@@ -3198,9 +3237,9 @@
const TypeFunc* tf = OptoRuntime::void_long_Type();
const TypePtr* no_memory_effects = NULL;
Node* time = make_runtime_call(RC_LEAF, tf, funcAddr, funcName, no_memory_effects);
- Node* value = _gvn.transform(new (C) ProjNode(time, TypeFunc::Parms+0));
+ Node* value = _gvn.transform(new ProjNode(time, TypeFunc::Parms+0));
#ifdef ASSERT
- Node* value_top = _gvn.transform(new (C) ProjNode(time, TypeFunc::Parms+1));
+ Node* value_top = _gvn.transform(new ProjNode(time, TypeFunc::Parms+1));
assert(value_top == top(), "second value must be top");
#endif
set_result(value);
@@ -3241,18 +3280,18 @@
// out of the function.
insert_mem_bar(Op_MemBarCPUOrder);
- RegionNode* result_rgn = new (C) RegionNode(PATH_LIMIT);
- PhiNode* result_val = new (C) PhiNode(result_rgn, TypeInt::BOOL);
-
- RegionNode* slow_region = new (C) RegionNode(1);
+ RegionNode* result_rgn = new RegionNode(PATH_LIMIT);
+ PhiNode* result_val = new PhiNode(result_rgn, TypeInt::BOOL);
+
+ RegionNode* slow_region = new RegionNode(1);
record_for_igvn(slow_region);
// (a) Receiving thread must be the current thread.
Node* rec_thr = argument(0);
Node* tls_ptr = NULL;
Node* cur_thr = generate_current_thread(tls_ptr);
- Node* cmp_thr = _gvn.transform(new (C) CmpPNode(cur_thr, rec_thr));
- Node* bol_thr = _gvn.transform(new (C) BoolNode(cmp_thr, BoolTest::ne));
+ Node* cmp_thr = _gvn.transform(new CmpPNode(cur_thr, rec_thr));
+ Node* bol_thr = _gvn.transform(new BoolNode(cmp_thr, BoolTest::ne));
generate_slow_guard(bol_thr, slow_region);
@@ -3263,33 +3302,33 @@
// Set the control input on the field _interrupted read to prevent it floating up.
Node* int_bit = make_load(control(), p, TypeInt::BOOL, T_INT, MemNode::unordered);
- Node* cmp_bit = _gvn.transform(new (C) CmpINode(int_bit, intcon(0)));
- Node* bol_bit = _gvn.transform(new (C) BoolNode(cmp_bit, BoolTest::ne));
+ Node* cmp_bit = _gvn.transform(new CmpINode(int_bit, intcon(0)));
+ Node* bol_bit = _gvn.transform(new BoolNode(cmp_bit, BoolTest::ne));
IfNode* iff_bit = create_and_map_if(control(), bol_bit, PROB_UNLIKELY_MAG(3), COUNT_UNKNOWN);
// First fast path: if (!TLS._interrupted) return false;
- Node* false_bit = _gvn.transform(new (C) IfFalseNode(iff_bit));
+ Node* false_bit = _gvn.transform(new IfFalseNode(iff_bit));
result_rgn->init_req(no_int_result_path, false_bit);
result_val->init_req(no_int_result_path, intcon(0));
// drop through to next case
- set_control( _gvn.transform(new (C) IfTrueNode(iff_bit)));
+ set_control( _gvn.transform(new IfTrueNode(iff_bit)));
#ifndef TARGET_OS_FAMILY_windows
// (c) Or, if interrupt bit is set and clear_int is false, use 2nd fast path.
Node* clr_arg = argument(1);
- Node* cmp_arg = _gvn.transform(new (C) CmpINode(clr_arg, intcon(0)));
- Node* bol_arg = _gvn.transform(new (C) BoolNode(cmp_arg, BoolTest::ne));
+ Node* cmp_arg = _gvn.transform(new CmpINode(clr_arg, intcon(0)));
+ Node* bol_arg = _gvn.transform(new BoolNode(cmp_arg, BoolTest::ne));
IfNode* iff_arg = create_and_map_if(control(), bol_arg, PROB_FAIR, COUNT_UNKNOWN);
// Second fast path: ... else if (!clear_int) return true;
- Node* false_arg = _gvn.transform(new (C) IfFalseNode(iff_arg));
+ Node* false_arg = _gvn.transform(new IfFalseNode(iff_arg));
result_rgn->init_req(no_clear_result_path, false_arg);
result_val->init_req(no_clear_result_path, intcon(1));
// drop through to next case
- set_control( _gvn.transform(new (C) IfTrueNode(iff_arg)));
+ set_control( _gvn.transform(new IfTrueNode(iff_arg)));
#else
// To return true on Windows you must read the _interrupted field
// and check the the event state i.e. take the slow path.
@@ -3375,9 +3414,9 @@
Node* mods = make_load(NULL, modp, TypeInt::INT, T_INT, MemNode::unordered);
Node* mask = intcon(modifier_mask);
Node* bits = intcon(modifier_bits);
- Node* mbit = _gvn.transform(new (C) AndINode(mods, mask));
- Node* cmp = _gvn.transform(new (C) CmpINode(mbit, bits));
- Node* bol = _gvn.transform(new (C) BoolNode(cmp, BoolTest::ne));
+ Node* mbit = _gvn.transform(new AndINode(mods, mask));
+ Node* cmp = _gvn.transform(new CmpINode(mbit, bits));
+ Node* bol = _gvn.transform(new BoolNode(cmp, BoolTest::ne));
return generate_fair_guard(bol, region);
}
Node* LibraryCallKit::generate_interface_guard(Node* kls, RegionNode* region) {
@@ -3450,9 +3489,9 @@
#endif
// Null-check the mirror, and the mirror's klass ptr (in case it is a primitive).
- RegionNode* region = new (C) RegionNode(PATH_LIMIT);
+ RegionNode* region = new RegionNode(PATH_LIMIT);
record_for_igvn(region);
- PhiNode* phi = new (C) PhiNode(region, return_type);
+ PhiNode* phi = new PhiNode(region, return_type);
// The mirror will never be null of Reflection.getClassAccessFlags, however
// it may be null for Class.isInstance or Class.getModifiers. Throw a NPE
@@ -3594,8 +3633,8 @@
PATH_LIMIT
};
- RegionNode* region = new (C) RegionNode(PATH_LIMIT);
- Node* phi = new (C) PhiNode(region, TypeInt::BOOL);
+ RegionNode* region = new RegionNode(PATH_LIMIT);
+ Node* phi = new PhiNode(region, TypeInt::BOOL);
record_for_igvn(region);
const TypePtr* adr_type = TypeRawPtr::BOTTOM; // memory type of loads
@@ -3642,8 +3681,8 @@
set_control(region->in(_prim_0_path)); // go back to first null check
if (!stopped()) {
// Since superc is primitive, make a guard for the superc==subc case.
- Node* cmp_eq = _gvn.transform(new (C) CmpPNode(args[0], args[1]));
- Node* bol_eq = _gvn.transform(new (C) BoolNode(cmp_eq, BoolTest::eq));
+ Node* cmp_eq = _gvn.transform(new CmpPNode(args[0], args[1]));
+ Node* bol_eq = _gvn.transform(new BoolNode(cmp_eq, BoolTest::eq));
generate_guard(bol_eq, region, PROB_FAIR);
if (region->req() == PATH_LIMIT+1) {
// A guard was added. If the added guard is taken, superc==subc.
@@ -3708,11 +3747,11 @@
? ((jint)Klass::_lh_array_tag_type_value
<< Klass::_lh_array_tag_shift)
: Klass::_lh_neutral_value);
- Node* cmp = _gvn.transform(new(C) CmpINode(layout_val, intcon(nval)));
+ Node* cmp = _gvn.transform(new CmpINode(layout_val, intcon(nval)));
BoolTest::mask btest = BoolTest::lt; // correct for testing is_[obj]array
// invert the test if we are looking for a non-array
if (not_array) btest = BoolTest(btest).negate();
- Node* bol = _gvn.transform(new(C) BoolNode(cmp, btest));
+ Node* bol = _gvn.transform(new BoolNode(cmp, btest));
return generate_fair_guard(bol, region);
}
@@ -3728,12 +3767,10 @@
if (stopped()) return true;
enum { _normal_path = 1, _slow_path = 2, PATH_LIMIT };
- RegionNode* result_reg = new(C) RegionNode(PATH_LIMIT);
- PhiNode* result_val = new(C) PhiNode(result_reg,
- TypeInstPtr::NOTNULL);
- PhiNode* result_io = new(C) PhiNode(result_reg, Type::ABIO);
- PhiNode* result_mem = new(C) PhiNode(result_reg, Type::MEMORY,
- TypePtr::BOTTOM);
+ RegionNode* result_reg = new RegionNode(PATH_LIMIT);
+ PhiNode* result_val = new PhiNode(result_reg, TypeInstPtr::NOTNULL);
+ PhiNode* result_io = new PhiNode(result_reg, Type::ABIO);
+ PhiNode* result_mem = new PhiNode(result_reg, Type::MEMORY, TypePtr::BOTTOM);
bool never_see_null = !too_many_traps(Deoptimization::Reason_null_check);
Node* klass_node = load_array_klass_from_mirror(mirror, never_see_null,
@@ -3840,7 +3877,7 @@
Node* klass_node = load_klass_from_mirror(array_type_mirror, false, NULL, 0);
klass_node = null_check(klass_node);
- RegionNode* bailout = new (C) RegionNode(1);
+ RegionNode* bailout = new RegionNode(1);
record_for_igvn(bailout);
// Despite the generic type of Arrays.copyOf, the mirror might be int, int[], etc.
@@ -3850,7 +3887,7 @@
// Improve the klass node's type from the new optimistic assumption:
ciKlass* ak = ciArrayKlass::make(env()->Object_klass());
const Type* akls = TypeKlassPtr::make(TypePtr::NotNull, ak, 0/*offset*/);
- Node* cast = new (C) CastPPNode(klass_node, akls);
+ Node* cast = new CastPPNode(klass_node, akls);
cast->init_req(0, control());
klass_node = _gvn.transform(cast);
}
@@ -3861,7 +3898,7 @@
Node* length = end;
if (_gvn.type(start) != TypeInt::ZERO) {
- length = _gvn.transform(new (C) SubINode(end, start));
+ length = _gvn.transform(new SubINode(end, start));
}
// Bail out if length is negative.
@@ -3880,7 +3917,7 @@
if (!stopped()) {
// How many elements will we copy from the original?
// The answer is MinI(orig_length - start, length).
- Node* orig_tail = _gvn.transform(new (C) SubINode(orig_length, start));
+ Node* orig_tail = _gvn.transform(new SubINode(orig_length, start));
Node* moved = generate_min_max(vmIntrinsics::_min, orig_tail, length);
newcopy = new_array(klass_node, length, 0); // no argments to push
@@ -3927,8 +3964,8 @@
const TypePtr* native_call_addr = TypeMetadataPtr::make(method);
Node* native_call = makecon(native_call_addr);
- Node* chk_native = _gvn.transform(new(C) CmpPNode(target_call, native_call));
- Node* test_native = _gvn.transform(new(C) BoolNode(chk_native, BoolTest::ne));
+ Node* chk_native = _gvn.transform(new CmpPNode(target_call, native_call));
+ Node* test_native = _gvn.transform(new BoolNode(chk_native, BoolTest::ne));
return generate_slow_guard(test_native, slow_region);
}
@@ -3953,7 +3990,7 @@
CallJavaNode* slow_call;
if (is_static) {
assert(!is_virtual, "");
- slow_call = new(C) CallStaticJavaNode(C, tf,
+ slow_call = new CallStaticJavaNode(C, tf,
SharedRuntime::get_resolve_static_call_stub(),
method, bci());
} else if (is_virtual) {
@@ -3969,12 +4006,12 @@
assert(vtable_index >= 0 || vtable_index == Method::nonvirtual_vtable_index,
err_msg_res("bad index %d", vtable_index));
}
- slow_call = new(C) CallDynamicJavaNode(tf,
+ slow_call = new CallDynamicJavaNode(tf,
SharedRuntime::get_resolve_virtual_call_stub(),
method, vtable_index, bci());
} else { // neither virtual nor static: opt_virtual
null_check_receiver();
- slow_call = new(C) CallStaticJavaNode(C, tf,
+ slow_call = new CallStaticJavaNode(C, tf,
SharedRuntime::get_resolve_opt_virtual_call_stub(),
method, bci());
slow_call->set_optimized_virtual(true);
@@ -3985,20 +4022,21 @@
}
-//------------------------------inline_native_hashcode--------------------
-// Build special case code for calls to hashCode on an object.
+/**
+ * Build special case code for calls to hashCode on an object. This call may
+ * be virtual (invokevirtual) or bound (invokespecial). For each case we generate
+ * slightly different code.
+ */
bool LibraryCallKit::inline_native_hashcode(bool is_virtual, bool is_static) {
assert(is_static == callee()->is_static(), "correct intrinsic selection");
assert(!(is_virtual && is_static), "either virtual, special, or static");
enum { _slow_path = 1, _fast_path, _null_path, PATH_LIMIT };
- RegionNode* result_reg = new(C) RegionNode(PATH_LIMIT);
- PhiNode* result_val = new(C) PhiNode(result_reg,
- TypeInt::INT);
- PhiNode* result_io = new(C) PhiNode(result_reg, Type::ABIO);
- PhiNode* result_mem = new(C) PhiNode(result_reg, Type::MEMORY,
- TypePtr::BOTTOM);
+ RegionNode* result_reg = new RegionNode(PATH_LIMIT);
+ PhiNode* result_val = new PhiNode(result_reg, TypeInt::INT);
+ PhiNode* result_io = new PhiNode(result_reg, Type::ABIO);
+ PhiNode* result_mem = new PhiNode(result_reg, Type::MEMORY, TypePtr::BOTTOM);
Node* obj = NULL;
if (!is_static) {
// Check for hashing null object
@@ -4024,15 +4062,9 @@
return true;
}
- // After null check, get the object's klass.
- Node* obj_klass = load_object_klass(obj);
-
- // This call may be virtual (invokevirtual) or bound (invokespecial).
- // For each case we generate slightly different code.
-
// We only go to the fast case code if we pass a number of guards. The
// paths which do not pass are accumulated in the slow_region.
- RegionNode* slow_region = new (C) RegionNode(1);
+ RegionNode* slow_region = new RegionNode(1);
record_for_igvn(slow_region);
// If this is a virtual call, we generate a funny guard. We pull out
@@ -4042,19 +4074,24 @@
// guard for non-virtual calls -- the caller is known to be the native
// Object hashCode().
if (is_virtual) {
+ // After null check, get the object's klass.
+ Node* obj_klass = load_object_klass(obj);
generate_virtual_guard(obj_klass, slow_region);
}
// Get the header out of the object, use LoadMarkNode when available
Node* header_addr = basic_plus_adr(obj, oopDesc::mark_offset_in_bytes());
- Node* header = make_load(control(), header_addr, TypeX_X, TypeX_X->basic_type(), MemNode::unordered);
+ // The control of the load must be NULL. Otherwise, the load can move before
+ // the null check after castPP removal.
+ Node* no_ctrl = NULL;
+ Node* header = make_load(no_ctrl, header_addr, TypeX_X, TypeX_X->basic_type(), MemNode::unordered);
// Test the header to see if it is unlocked.
Node *lock_mask = _gvn.MakeConX(markOopDesc::biased_lock_mask_in_place);
- Node *lmasked_header = _gvn.transform(new (C) AndXNode(header, lock_mask));
+ Node *lmasked_header = _gvn.transform(new AndXNode(header, lock_mask));
Node *unlocked_val = _gvn.MakeConX(markOopDesc::unlocked_value);
- Node *chk_unlocked = _gvn.transform(new (C) CmpXNode( lmasked_header, unlocked_val));
- Node *test_unlocked = _gvn.transform(new (C) BoolNode( chk_unlocked, BoolTest::ne));
+ Node *chk_unlocked = _gvn.transform(new CmpXNode( lmasked_header, unlocked_val));
+ Node *test_unlocked = _gvn.transform(new BoolNode( chk_unlocked, BoolTest::ne));
generate_slow_guard(test_unlocked, slow_region);
@@ -4064,17 +4101,17 @@
// vm: see markOop.hpp.
Node *hash_mask = _gvn.intcon(markOopDesc::hash_mask);
Node *hash_shift = _gvn.intcon(markOopDesc::hash_shift);
- Node *hshifted_header= _gvn.transform(new (C) URShiftXNode(header, hash_shift));
+ Node *hshifted_header= _gvn.transform(new URShiftXNode(header, hash_shift));
// This hack lets the hash bits live anywhere in the mark object now, as long
// as the shift drops the relevant bits into the low 32 bits. Note that
// Java spec says that HashCode is an int so there's no point in capturing
// an 'X'-sized hashcode (32 in 32-bit build or 64 in 64-bit build).
hshifted_header = ConvX2I(hshifted_header);
- Node *hash_val = _gvn.transform(new (C) AndINode(hshifted_header, hash_mask));
+ Node *hash_val = _gvn.transform(new AndINode(hshifted_header, hash_mask));
Node *no_hash_val = _gvn.intcon(markOopDesc::no_hash);
- Node *chk_assigned = _gvn.transform(new (C) CmpINode( hash_val, no_hash_val));
- Node *test_assigned = _gvn.transform(new (C) BoolNode( chk_assigned, BoolTest::eq));
+ Node *chk_assigned = _gvn.transform(new CmpINode( hash_val, no_hash_val));
+ Node *test_assigned = _gvn.transform(new BoolNode( chk_assigned, BoolTest::eq));
generate_slow_guard(test_assigned, slow_region);
@@ -4213,19 +4250,19 @@
Node* result;
switch (id) {
- case vmIntrinsics::_floatToRawIntBits: result = new (C) MoveF2INode(arg); break;
- case vmIntrinsics::_intBitsToFloat: result = new (C) MoveI2FNode(arg); break;
- case vmIntrinsics::_doubleToRawLongBits: result = new (C) MoveD2LNode(arg); break;
- case vmIntrinsics::_longBitsToDouble: result = new (C) MoveL2DNode(arg); break;
+ case vmIntrinsics::_floatToRawIntBits: result = new MoveF2INode(arg); break;
+ case vmIntrinsics::_intBitsToFloat: result = new MoveI2FNode(arg); break;
+ case vmIntrinsics::_doubleToRawLongBits: result = new MoveD2LNode(arg); break;
+ case vmIntrinsics::_longBitsToDouble: result = new MoveL2DNode(arg); break;
case vmIntrinsics::_doubleToLongBits: {
// two paths (plus control) merge in a wood
- RegionNode *r = new (C) RegionNode(3);
- Node *phi = new (C) PhiNode(r, TypeLong::LONG);
-
- Node *cmpisnan = _gvn.transform(new (C) CmpDNode(arg, arg));
+ RegionNode *r = new RegionNode(3);
+ Node *phi = new PhiNode(r, TypeLong::LONG);
+
+ Node *cmpisnan = _gvn.transform(new CmpDNode(arg, arg));
// Build the boolean node
- Node *bolisnan = _gvn.transform(new (C) BoolNode(cmpisnan, BoolTest::ne));
+ Node *bolisnan = _gvn.transform(new BoolNode(cmpisnan, BoolTest::ne));
// Branch either way.
// NaN case is less traveled, which makes all the difference.
@@ -4233,7 +4270,7 @@
Node *opt_isnan = _gvn.transform(ifisnan);
assert( opt_isnan->is_If(), "Expect an IfNode");
IfNode *opt_ifisnan = (IfNode*)opt_isnan;
- Node *iftrue = _gvn.transform(new (C) IfTrueNode(opt_ifisnan));
+ Node *iftrue = _gvn.transform(new IfTrueNode(opt_ifisnan));
set_control(iftrue);
@@ -4243,10 +4280,10 @@
r->init_req(1, iftrue);
// Else fall through
- Node *iffalse = _gvn.transform(new (C) IfFalseNode(opt_ifisnan));
+ Node *iffalse = _gvn.transform(new IfFalseNode(opt_ifisnan));
set_control(iffalse);
- phi->init_req(2, _gvn.transform(new (C) MoveD2LNode(arg)));
+ phi->init_req(2, _gvn.transform(new MoveD2LNode(arg)));
r->init_req(2, iffalse);
// Post merge
@@ -4261,12 +4298,12 @@
case vmIntrinsics::_floatToIntBits: {
// two paths (plus control) merge in a wood
- RegionNode *r = new (C) RegionNode(3);
- Node *phi = new (C) PhiNode(r, TypeInt::INT);
-
- Node *cmpisnan = _gvn.transform(new (C) CmpFNode(arg, arg));
+ RegionNode *r = new RegionNode(3);
+ Node *phi = new PhiNode(r, TypeInt::INT);
+
+ Node *cmpisnan = _gvn.transform(new CmpFNode(arg, arg));
// Build the boolean node
- Node *bolisnan = _gvn.transform(new (C) BoolNode(cmpisnan, BoolTest::ne));
+ Node *bolisnan = _gvn.transform(new BoolNode(cmpisnan, BoolTest::ne));
// Branch either way.
// NaN case is less traveled, which makes all the difference.
@@ -4274,7 +4311,7 @@
Node *opt_isnan = _gvn.transform(ifisnan);
assert( opt_isnan->is_If(), "Expect an IfNode");
IfNode *opt_ifisnan = (IfNode*)opt_isnan;
- Node *iftrue = _gvn.transform(new (C) IfTrueNode(opt_ifisnan));
+ Node *iftrue = _gvn.transform(new IfTrueNode(opt_ifisnan));
set_control(iftrue);
@@ -4284,10 +4321,10 @@
r->init_req(1, iftrue);
// Else fall through
- Node *iffalse = _gvn.transform(new (C) IfFalseNode(opt_ifisnan));
+ Node *iffalse = _gvn.transform(new IfFalseNode(opt_ifisnan));
set_control(iffalse);
- phi->init_req(2, _gvn.transform(new (C) MoveF2INode(arg)));
+ phi->init_req(2, _gvn.transform(new MoveF2INode(arg)));
r->init_req(2, iffalse);
// Post merge
@@ -4403,8 +4440,8 @@
// Compute the length also, if needed:
Node* countx = size;
- countx = _gvn.transform(new (C) SubXNode(countx, MakeConX(base_off)));
- countx = _gvn.transform(new (C) URShiftXNode(countx, intcon(LogBytesPerLong) ));
+ countx = _gvn.transform(new SubXNode(countx, MakeConX(base_off)));
+ countx = _gvn.transform(new URShiftXNode(countx, intcon(LogBytesPerLong) ));
const TypePtr* raw_adr_type = TypeRawPtr::BOTTOM;
bool disjoint_bases = true;
@@ -4493,12 +4530,10 @@
_instance_path, // plain instance allocation, plus arrayof_long_arraycopy
PATH_LIMIT
};
- RegionNode* result_reg = new(C) RegionNode(PATH_LIMIT);
- result_val = new(C) PhiNode(result_reg,
- TypeInstPtr::NOTNULL);
- PhiNode* result_i_o = new(C) PhiNode(result_reg, Type::ABIO);
- PhiNode* result_mem = new(C) PhiNode(result_reg, Type::MEMORY,
- TypePtr::BOTTOM);
+ RegionNode* result_reg = new RegionNode(PATH_LIMIT);
+ result_val = new PhiNode(result_reg, TypeInstPtr::NOTNULL);
+ PhiNode* result_i_o = new PhiNode(result_reg, Type::ABIO);
+ PhiNode* result_mem = new PhiNode(result_reg, Type::MEMORY, TypePtr::BOTTOM);
record_for_igvn(result_reg);
const TypePtr* raw_adr_type = TypeRawPtr::BOTTOM;
@@ -4554,7 +4589,7 @@
// We only go to the instance fast case code if we pass a number of guards.
// The paths which do not pass are accumulated in the slow_region.
- RegionNode* slow_region = new (C) RegionNode(1);
+ RegionNode* slow_region = new RegionNode(1);
record_for_igvn(slow_region);
if (!stopped()) {
// It's an instance (we did array above). Make the slow-path tests.
@@ -4583,7 +4618,10 @@
// It's an instance, and it passed the slow-path tests.
PreserveJVMState pjvms(this);
Node* obj_size = NULL;
- Node* alloc_obj = new_instance(obj_klass, NULL, &obj_size);
+ // Need to deoptimize on exception from allocation since Object.clone intrinsic
+ // is reexecuted if deoptimization occurs and there could be problems when merging
+ // exception state between multiple Object.clone versions (reexecute=true vs reexecute=false).
+ Node* alloc_obj = new_instance(obj_klass, NULL, &obj_size, /*deoptimize_on_exception=*/true);
copy_to_clone(obj, alloc_obj, obj_size, false, !use_ReduceInitialCardMarks());
@@ -4811,7 +4849,7 @@
// (8) dest_offset + length must not exceed length of dest.
// (9) each element of an oop array must be assignable
- RegionNode* slow_region = new (C) RegionNode(1);
+ RegionNode* slow_region = new RegionNode(1);
record_for_igvn(slow_region);
// (3) operands must not be null
@@ -4899,7 +4937,7 @@
RegionNode* slow_region) {
if (slow_region == NULL) {
- slow_region = new(C) RegionNode(1);
+ slow_region = new RegionNode(1);
record_for_igvn(slow_region);
}
@@ -4947,9 +4985,9 @@
bcopy_path = 5, // copy primitive array by 64-bit blocks
PATH_LIMIT = 6
};
- RegionNode* result_region = new(C) RegionNode(PATH_LIMIT);
- PhiNode* result_i_o = new(C) PhiNode(result_region, Type::ABIO);
- PhiNode* result_memory = new(C) PhiNode(result_region, Type::MEMORY, adr_type);
+ RegionNode* result_region = new RegionNode(PATH_LIMIT);
+ PhiNode* result_i_o = new PhiNode(result_region, Type::ABIO);
+ PhiNode* result_memory = new PhiNode(result_region, Type::MEMORY, adr_type);
record_for_igvn(result_region);
_gvn.set_type_bottom(result_i_o);
_gvn.set_type_bottom(result_memory);
@@ -5023,8 +5061,7 @@
// are dest_head = dest[0..off] and dest_tail = dest[off+len..dest.length].
Node* dest_size = alloc->in(AllocateNode::AllocSize);
Node* dest_length = alloc->in(AllocateNode::ALength);
- Node* dest_tail = _gvn.transform(new(C) AddINode(dest_offset,
- copy_length));
+ Node* dest_tail = _gvn.transform(new AddINode(dest_offset, copy_length));
// If there is a head section that needs zeroing, do it now.
if (find_int_con(dest_offset, -1) != 0) {
@@ -5040,8 +5077,8 @@
// the copy to a more hardware-friendly word size of 64 bits.
Node* tail_ctl = NULL;
if (!stopped() && !dest_tail->eqv_uncast(dest_length)) {
- Node* cmp_lt = _gvn.transform(new(C) CmpINode(dest_tail, dest_length));
- Node* bol_lt = _gvn.transform(new(C) BoolNode(cmp_lt, BoolTest::lt));
+ Node* cmp_lt = _gvn.transform(new CmpINode(dest_tail, dest_length));
+ Node* bol_lt = _gvn.transform(new BoolNode(cmp_lt, BoolTest::lt));
tail_ctl = generate_slow_guard(bol_lt, NULL);
assert(tail_ctl != NULL || !stopped(), "must be an outcome");
}
@@ -5075,8 +5112,8 @@
dest_size);
} else {
// Make a local merge.
- Node* done_ctl = new(C) RegionNode(3);
- Node* done_mem = new(C) PhiNode(done_ctl, Type::MEMORY, adr_type);
+ Node* done_ctl = new RegionNode(3);
+ Node* done_mem = new PhiNode(done_ctl, Type::MEMORY, adr_type);
done_ctl->init_req(1, notail_ctl);
done_mem->init_req(1, memory(adr_type));
generate_clear_array(adr_type, dest, basic_elem_type,
@@ -5171,21 +5208,21 @@
// Clean up after the checked call.
// The returned value is either 0 or -1^K,
// where K = number of partially transferred array elements.
- Node* cmp = _gvn.transform(new(C) CmpINode(checked_value, intcon(0)));
- Node* bol = _gvn.transform(new(C) BoolNode(cmp, BoolTest::eq));
+ Node* cmp = _gvn.transform(new CmpINode(checked_value, intcon(0)));
+ Node* bol = _gvn.transform(new BoolNode(cmp, BoolTest::eq));
IfNode* iff = create_and_map_if(control(), bol, PROB_MAX, COUNT_UNKNOWN);
// If it is 0, we are done, so transfer to the end.
- Node* checks_done = _gvn.transform(new(C) IfTrueNode(iff));
+ Node* checks_done = _gvn.transform(new IfTrueNode(iff));
result_region->init_req(checked_path, checks_done);
result_i_o ->init_req(checked_path, checked_i_o);
result_memory->init_req(checked_path, checked_mem);
// If it is not zero, merge into the slow call.
- set_control( _gvn.transform(new(C) IfFalseNode(iff) ));
- RegionNode* slow_reg2 = new(C) RegionNode(3);
- PhiNode* slow_i_o2 = new(C) PhiNode(slow_reg2, Type::ABIO);
- PhiNode* slow_mem2 = new(C) PhiNode(slow_reg2, Type::MEMORY, adr_type);
+ set_control( _gvn.transform(new IfFalseNode(iff) ));
+ RegionNode* slow_reg2 = new RegionNode(3);
+ PhiNode* slow_i_o2 = new PhiNode(slow_reg2, Type::ABIO);
+ PhiNode* slow_mem2 = new PhiNode(slow_reg2, Type::MEMORY, adr_type);
record_for_igvn(slow_reg2);
slow_reg2 ->init_req(1, slow_control);
slow_i_o2 ->init_req(1, slow_i_o);
@@ -5205,16 +5242,16 @@
} else {
// We must continue the copy exactly where it failed, or else
// another thread might see the wrong number of writes to dest.
- Node* checked_offset = _gvn.transform(new(C) XorINode(checked_value, intcon(-1)));
- Node* slow_offset = new(C) PhiNode(slow_reg2, TypeInt::INT);
+ Node* checked_offset = _gvn.transform(new XorINode(checked_value, intcon(-1)));
+ Node* slow_offset = new PhiNode(slow_reg2, TypeInt::INT);
slow_offset->init_req(1, intcon(0));
slow_offset->init_req(2, checked_offset);
slow_offset = _gvn.transform(slow_offset);
// Adjust the arguments by the conditionally incoming offset.
- Node* src_off_plus = _gvn.transform(new(C) AddINode(src_offset, slow_offset));
- Node* dest_off_plus = _gvn.transform(new(C) AddINode(dest_offset, slow_offset));
- Node* length_minus = _gvn.transform(new(C) SubINode(copy_length, slow_offset));
+ Node* src_off_plus = _gvn.transform(new AddINode(src_offset, slow_offset));
+ Node* dest_off_plus = _gvn.transform(new AddINode(dest_offset, slow_offset));
+ Node* length_minus = _gvn.transform(new SubINode(copy_length, slow_offset));
// Tweak the node variables to adjust the code produced below:
src_offset = src_off_plus;
@@ -5435,10 +5472,10 @@
int end_round = (-1 << scale) & (BytesPerLong - 1);
Node* end = ConvI2X(slice_len);
if (scale != 0)
- end = _gvn.transform(new(C) LShiftXNode(end, intcon(scale) ));
+ end = _gvn.transform(new LShiftXNode(end, intcon(scale) ));
end_base += end_round;
- end = _gvn.transform(new(C) AddXNode(end, MakeConX(end_base)));
- end = _gvn.transform(new(C) AndXNode(end, MakeConX(~end_round)));
+ end = _gvn.transform(new AddXNode(end, MakeConX(end_base)));
+ end = _gvn.transform(new AndXNode(end, MakeConX(~end_round)));
mem = ClearArrayNode::clear_memory(control(), mem, dest,
start_con, end, &_gvn);
} else if (start_con < 0 && dest_size != top()) {
@@ -5447,8 +5484,8 @@
Node* start = slice_idx;
start = ConvI2X(start);
if (scale != 0)
- start = _gvn.transform(new(C) LShiftXNode( start, intcon(scale) ));
- start = _gvn.transform(new(C) AddXNode(start, MakeConX(abase)));
+ start = _gvn.transform(new LShiftXNode( start, intcon(scale) ));
+ start = _gvn.transform(new AddXNode(start, MakeConX(abase)));
if ((bump_bit | clear_low) != 0) {
int to_clear = (bump_bit | clear_low);
// Align up mod 8, then store a jint zero unconditionally
@@ -5459,14 +5496,14 @@
assert((abase & to_clear) == 0, "array base must be long-aligned");
} else {
// Bump 'start' up to (or past) the next jint boundary:
- start = _gvn.transform(new(C) AddXNode(start, MakeConX(bump_bit)));
+ start = _gvn.transform(new AddXNode(start, MakeConX(bump_bit)));
assert((abase & clear_low) == 0, "array base must be int-aligned");
}
// Round bumped 'start' down to jlong boundary in body of array.
- start = _gvn.transform(new(C) AndXNode(start, MakeConX(~to_clear)));
+ start = _gvn.transform(new AndXNode(start, MakeConX(~to_clear)));
if (bump_bit != 0) {
// Store a zero to the immediately preceding jint:
- Node* x1 = _gvn.transform(new(C) AddXNode(start, MakeConX(-bump_bit)));
+ Node* x1 = _gvn.transform(new AddXNode(start, MakeConX(-bump_bit)));
Node* p1 = basic_plus_adr(dest, x1);
mem = StoreNode::make(_gvn, control(), mem, p1, adr_type, intcon(0), T_INT, MemNode::unordered);
mem = _gvn.transform(mem);
@@ -5533,8 +5570,8 @@
Node* sptr = basic_plus_adr(src, src_off);
Node* dptr = basic_plus_adr(dest, dest_off);
Node* countx = dest_size;
- countx = _gvn.transform(new (C) SubXNode(countx, MakeConX(dest_off)));
- countx = _gvn.transform(new (C) URShiftXNode(countx, intcon(LogBytesPerLong)));
+ countx = _gvn.transform(new SubXNode(countx, MakeConX(dest_off)));
+ countx = _gvn.transform(new URShiftXNode(countx, intcon(LogBytesPerLong)));
bool disjoint_bases = true; // since alloc != NULL
generate_unchecked_arraycopy(adr_type, T_LONG, disjoint_bases,
@@ -5584,7 +5621,7 @@
// super_check_offset, for the desired klass.
int sco_offset = in_bytes(Klass::super_check_offset_offset());
Node* p3 = basic_plus_adr(dest_elem_klass, sco_offset);
- Node* n3 = new(C) LoadINode(NULL, memory(p3), p3, _gvn.type(p3)->is_ptr(), TypeInt::INT, MemNode::unordered);
+ Node* n3 = new LoadINode(NULL, memory(p3), p3, _gvn.type(p3)->is_ptr(), TypeInt::INT, MemNode::unordered);
Node* check_offset = ConvI2X(_gvn.transform(n3));
Node* check_value = dest_elem_klass;
@@ -5602,7 +5639,7 @@
check_offset XTOP,
check_value);
- return _gvn.transform(new (C) ProjNode(call, TypeFunc::Parms));
+ return _gvn.transform(new ProjNode(call, TypeFunc::Parms));
}
@@ -5624,7 +5661,7 @@
copyfunc_addr, "generic_arraycopy", adr_type,
src, src_offset, dest, dest_offset, copy_length);
- return _gvn.transform(new (C) ProjNode(call, TypeFunc::Parms));
+ return _gvn.transform(new ProjNode(call, TypeFunc::Parms));
}
// Helper function; generates the fast out-of-line call to an arraycopy stub.
@@ -5691,9 +5728,9 @@
// 'dst_start' points to dst array + scaled offset
const TypeAryPtr* mtype = TypeAryPtr::BYTES;
- Node* enc = new (C) EncodeISOArrayNode(control(), memory(mtype), src_start, dst_start, length);
+ Node* enc = new EncodeISOArrayNode(control(), memory(mtype), src_start, dst_start, length);
enc = _gvn.transform(enc);
- Node* res_mem = _gvn.transform(new (C) SCMemProjNode(enc));
+ Node* res_mem = _gvn.transform(new SCMemProjNode(enc));
set_memory(res_mem, mtype);
set_result(enc);
return true;
@@ -5718,18 +5755,18 @@
*/
Node* M1 = intcon(-1);
- crc = _gvn.transform(new (C) XorINode(crc, M1));
- Node* result = _gvn.transform(new (C) XorINode(crc, b));
- result = _gvn.transform(new (C) AndINode(result, intcon(0xFF)));
+ crc = _gvn.transform(new XorINode(crc, M1));
+ Node* result = _gvn.transform(new XorINode(crc, b));
+ result = _gvn.transform(new AndINode(result, intcon(0xFF)));
Node* base = makecon(TypeRawPtr::make(StubRoutines::crc_table_addr()));
- Node* offset = _gvn.transform(new (C) LShiftINode(result, intcon(0x2)));
+ Node* offset = _gvn.transform(new LShiftINode(result, intcon(0x2)));
Node* adr = basic_plus_adr(top(), base, ConvI2X(offset));
result = make_load(control(), adr, TypeInt::INT, T_INT, MemNode::unordered);
- crc = _gvn.transform(new (C) URShiftINode(crc, intcon(8)));
- result = _gvn.transform(new (C) XorINode(crc, result));
- result = _gvn.transform(new (C) XorINode(result, M1));
+ crc = _gvn.transform(new URShiftINode(crc, intcon(8)));
+ result = _gvn.transform(new XorINode(crc, result));
+ result = _gvn.transform(new XorINode(result, M1));
set_result(result);
return true;
}
@@ -5773,7 +5810,7 @@
Node* call = make_runtime_call(RC_LEAF|RC_NO_FP, OptoRuntime::updateBytesCRC32_Type(),
stubAddr, stubName, TypePtr::BOTTOM,
crc, src_start, length);
- Node* result = _gvn.transform(new (C) ProjNode(call, TypeFunc::Parms));
+ Node* result = _gvn.transform(new ProjNode(call, TypeFunc::Parms));
set_result(result);
return true;
}
@@ -5792,7 +5829,7 @@
Node* length = argument(4); // type: int
src = ConvL2X(src); // adjust Java long to machine word
- Node* base = _gvn.transform(new (C) CastX2PNode(src));
+ Node* base = _gvn.transform(new CastX2PNode(src));
offset = ConvI2X(offset);
// 'src_start' points to src array + scaled offset
@@ -5805,7 +5842,7 @@
Node* call = make_runtime_call(RC_LEAF|RC_NO_FP, OptoRuntime::updateBytesCRC32_Type(),
stubAddr, stubName, TypePtr::BOTTOM,
crc, src_start, length);
- Node* result = _gvn.transform(new (C) ProjNode(call, TypeFunc::Parms));
+ Node* result = _gvn.transform(new ProjNode(call, TypeFunc::Parms));
set_result(result);
return true;
}
@@ -5870,7 +5907,12 @@
BasicType bt = field->layout_type();
// Build the resultant type of the load
- const Type *type = TypeOopPtr::make_from_klass(field_klass->as_klass());
+ const Type *type;
+ if (bt == T_OBJECT) {
+ type = TypeOopPtr::make_from_klass(field_klass->as_klass());
+ } else {
+ type = Type::get_const_basic_type(bt);
+ }
// Build the load.
Node* loadedField = make_load(NULL, adr, type, bt, adr_type, MemNode::unordered, is_vol);
@@ -6000,12 +6042,12 @@
assert(tinst != NULL, "CBC obj is null");
assert(tinst->klass()->is_loaded(), "CBC obj is not loaded");
ciKlass* klass_AESCrypt = tinst->klass()->as_instance_klass()->find_klass(ciSymbol::make("com/sun/crypto/provider/AESCrypt"));
- if (!klass_AESCrypt->is_loaded()) return false;
+ assert(klass_AESCrypt->is_loaded(), "predicate checks that this class is loaded");
ciInstanceKlass* instklass_AESCrypt = klass_AESCrypt->as_instance_klass();
const TypeKlassPtr* aklass = TypeKlassPtr::make(instklass_AESCrypt);
const TypeOopPtr* xtype = aklass->as_instance_type();
- Node* aescrypt_object = new(C) CheckCastPPNode(control(), embeddedCipherObj, xtype);
+ Node* aescrypt_object = new CheckCastPPNode(control(), embeddedCipherObj, xtype);
aescrypt_object = _gvn.transform(aescrypt_object);
// we need to get the start of the aescrypt_object's expanded key array
@@ -6038,7 +6080,7 @@
}
// return cipher length (int)
- Node* retvalue = _gvn.transform(new (C) ProjNode(cbcCrypt, TypeFunc::Parms));
+ Node* retvalue = _gvn.transform(new ProjNode(cbcCrypt, TypeFunc::Parms));
set_result(retvalue);
return true;
}
@@ -6075,11 +6117,8 @@
// note cipher==plain is more conservative than the original java code but that's OK
//
Node* LibraryCallKit::inline_cipherBlockChaining_AESCrypt_predicate(bool decrypting) {
- // First, check receiver for NULL since it is virtual method.
+ // The receiver was checked for NULL already.
Node* objCBC = argument(0);
- objCBC = null_check(objCBC);
-
- if (stopped()) return NULL; // Always NULL
// Load embeddedCipher field of CipherBlockChaining object.
Node* embeddedCipherObj = load_field_from_object(objCBC, "embeddedCipher", "Lcom/sun/crypto/provider/SymmetricCipher;", /*is_exact*/ false);
@@ -6102,8 +6141,8 @@
ciInstanceKlass* instklass_AESCrypt = klass_AESCrypt->as_instance_klass();
Node* instof = gen_instanceof(embeddedCipherObj, makecon(TypeKlassPtr::make(instklass_AESCrypt)));
- Node* cmp_instof = _gvn.transform(new (C) CmpINode(instof, intcon(1)));
- Node* bool_instof = _gvn.transform(new (C) BoolNode(cmp_instof, BoolTest::ne));
+ Node* cmp_instof = _gvn.transform(new CmpINode(instof, intcon(1)));
+ Node* bool_instof = _gvn.transform(new BoolNode(cmp_instof, BoolTest::ne));
Node* instof_false = generate_guard(bool_instof, NULL, PROB_MIN);
@@ -6114,15 +6153,270 @@
// for decryption, we need to add a further check to avoid
// taking the intrinsic path when cipher and plain are the same
// see the original java code for why.
- RegionNode* region = new(C) RegionNode(3);
+ RegionNode* region = new RegionNode(3);
region->init_req(1, instof_false);
Node* src = argument(1);
Node* dest = argument(4);
- Node* cmp_src_dest = _gvn.transform(new (C) CmpPNode(src, dest));
- Node* bool_src_dest = _gvn.transform(new (C) BoolNode(cmp_src_dest, BoolTest::eq));
+ Node* cmp_src_dest = _gvn.transform(new CmpPNode(src, dest));
+ Node* bool_src_dest = _gvn.transform(new BoolNode(cmp_src_dest, BoolTest::eq));
Node* src_dest_conjoint = generate_guard(bool_src_dest, NULL, PROB_MIN);
region->init_req(2, src_dest_conjoint);
record_for_igvn(region);
return _gvn.transform(region);
}
+
+//------------------------------inline_sha_implCompress-----------------------
+//
+// Calculate SHA (i.e., SHA-1) for single-block byte[] array.
+// void com.sun.security.provider.SHA.implCompress(byte[] buf, int ofs)
+//
+// Calculate SHA2 (i.e., SHA-244 or SHA-256) for single-block byte[] array.
+// void com.sun.security.provider.SHA2.implCompress(byte[] buf, int ofs)
+//
+// Calculate SHA5 (i.e., SHA-384 or SHA-512) for single-block byte[] array.
+// void com.sun.security.provider.SHA5.implCompress(byte[] buf, int ofs)
+//
+bool LibraryCallKit::inline_sha_implCompress(vmIntrinsics::ID id) {
+ assert(callee()->signature()->size() == 2, "sha_implCompress has 2 parameters");
+
+ Node* sha_obj = argument(0);
+ Node* src = argument(1); // type oop
+ Node* ofs = argument(2); // type int
+
+ const Type* src_type = src->Value(&_gvn);
+ const TypeAryPtr* top_src = src_type->isa_aryptr();
+ if (top_src == NULL || top_src->klass() == NULL) {
+ // failed array check
+ return false;
+ }
+ // Figure out the size and type of the elements we will be copying.
+ BasicType src_elem = src_type->isa_aryptr()->klass()->as_array_klass()->element_type()->basic_type();
+ if (src_elem != T_BYTE) {
+ return false;
+ }
+ // 'src_start' points to src array + offset
+ Node* src_start = array_element_address(src, ofs, src_elem);
+ Node* state = NULL;
+ address stubAddr;
+ const char *stubName;
+
+ switch(id) {
+ case vmIntrinsics::_sha_implCompress:
+ assert(UseSHA1Intrinsics, "need SHA1 instruction support");
+ state = get_state_from_sha_object(sha_obj);
+ stubAddr = StubRoutines::sha1_implCompress();
+ stubName = "sha1_implCompress";
+ break;
+ case vmIntrinsics::_sha2_implCompress:
+ assert(UseSHA256Intrinsics, "need SHA256 instruction support");
+ state = get_state_from_sha_object(sha_obj);
+ stubAddr = StubRoutines::sha256_implCompress();
+ stubName = "sha256_implCompress";
+ break;
+ case vmIntrinsics::_sha5_implCompress:
+ assert(UseSHA512Intrinsics, "need SHA512 instruction support");
+ state = get_state_from_sha5_object(sha_obj);
+ stubAddr = StubRoutines::sha512_implCompress();
+ stubName = "sha512_implCompress";
+ break;
+ default:
+ fatal_unexpected_iid(id);
+ return false;
+ }
+ if (state == NULL) return false;
+
+ // Call the stub.
+ Node* call = make_runtime_call(RC_LEAF|RC_NO_FP, OptoRuntime::sha_implCompress_Type(),
+ stubAddr, stubName, TypePtr::BOTTOM,
+ src_start, state);
+
+ return true;
+}
+
+//------------------------------inline_digestBase_implCompressMB-----------------------
+//
+// Calculate SHA/SHA2/SHA5 for multi-block byte[] array.
+// int com.sun.security.provider.DigestBase.implCompressMultiBlock(byte[] b, int ofs, int limit)
+//
+bool LibraryCallKit::inline_digestBase_implCompressMB(int predicate) {
+ assert(UseSHA1Intrinsics || UseSHA256Intrinsics || UseSHA512Intrinsics,
+ "need SHA1/SHA256/SHA512 instruction support");
+ assert((uint)predicate < 3, "sanity");
+ assert(callee()->signature()->size() == 3, "digestBase_implCompressMB has 3 parameters");
+
+ Node* digestBase_obj = argument(0); // The receiver was checked for NULL already.
+ Node* src = argument(1); // byte[] array
+ Node* ofs = argument(2); // type int
+ Node* limit = argument(3); // type int
+
+ const Type* src_type = src->Value(&_gvn);
+ const TypeAryPtr* top_src = src_type->isa_aryptr();
+ if (top_src == NULL || top_src->klass() == NULL) {
+ // failed array check
+ return false;
+ }
+ // Figure out the size and type of the elements we will be copying.
+ BasicType src_elem = src_type->isa_aryptr()->klass()->as_array_klass()->element_type()->basic_type();
+ if (src_elem != T_BYTE) {
+ return false;
+ }
+ // 'src_start' points to src array + offset
+ Node* src_start = array_element_address(src, ofs, src_elem);
+
+ const char* klass_SHA_name = NULL;
+ const char* stub_name = NULL;
+ address stub_addr = NULL;
+ bool long_state = false;
+
+ switch (predicate) {
+ case 0:
+ if (UseSHA1Intrinsics) {
+ klass_SHA_name = "sun/security/provider/SHA";
+ stub_name = "sha1_implCompressMB";
+ stub_addr = StubRoutines::sha1_implCompressMB();
+ }
+ break;
+ case 1:
+ if (UseSHA256Intrinsics) {
+ klass_SHA_name = "sun/security/provider/SHA2";
+ stub_name = "sha256_implCompressMB";
+ stub_addr = StubRoutines::sha256_implCompressMB();
+ }
+ break;
+ case 2:
+ if (UseSHA512Intrinsics) {
+ klass_SHA_name = "sun/security/provider/SHA5";
+ stub_name = "sha512_implCompressMB";
+ stub_addr = StubRoutines::sha512_implCompressMB();
+ long_state = true;
+ }
+ break;
+ default:
+ fatal(err_msg_res("unknown SHA intrinsic predicate: %d", predicate));
+ }
+ if (klass_SHA_name != NULL) {
+ // get DigestBase klass to lookup for SHA klass
+ const TypeInstPtr* tinst = _gvn.type(digestBase_obj)->isa_instptr();
+ assert(tinst != NULL, "digestBase_obj is not instance???");
+ assert(tinst->klass()->is_loaded(), "DigestBase is not loaded");
+
+ ciKlass* klass_SHA = tinst->klass()->as_instance_klass()->find_klass(ciSymbol::make(klass_SHA_name));
+ assert(klass_SHA->is_loaded(), "predicate checks that this class is loaded");
+ ciInstanceKlass* instklass_SHA = klass_SHA->as_instance_klass();
+ return inline_sha_implCompressMB(digestBase_obj, instklass_SHA, long_state, stub_addr, stub_name, src_start, ofs, limit);
+ }
+ return false;
+}
+//------------------------------inline_sha_implCompressMB-----------------------
+bool LibraryCallKit::inline_sha_implCompressMB(Node* digestBase_obj, ciInstanceKlass* instklass_SHA,
+ bool long_state, address stubAddr, const char *stubName,
+ Node* src_start, Node* ofs, Node* limit) {
+ const TypeKlassPtr* aklass = TypeKlassPtr::make(instklass_SHA);
+ const TypeOopPtr* xtype = aklass->as_instance_type();
+ Node* sha_obj = new CheckCastPPNode(control(), digestBase_obj, xtype);
+ sha_obj = _gvn.transform(sha_obj);
+
+ Node* state;
+ if (long_state) {
+ state = get_state_from_sha5_object(sha_obj);
+ } else {
+ state = get_state_from_sha_object(sha_obj);
+ }
+ if (state == NULL) return false;
+
+ // Call the stub.
+ Node* call = make_runtime_call(RC_LEAF|RC_NO_FP,
+ OptoRuntime::digestBase_implCompressMB_Type(),
+ stubAddr, stubName, TypePtr::BOTTOM,
+ src_start, state, ofs, limit);
+ // return ofs (int)
+ Node* result = _gvn.transform(new ProjNode(call, TypeFunc::Parms));
+ set_result(result);
+
+ return true;
+}
+
+//------------------------------get_state_from_sha_object-----------------------
+Node * LibraryCallKit::get_state_from_sha_object(Node *sha_object) {
+ Node* sha_state = load_field_from_object(sha_object, "state", "[I", /*is_exact*/ false);
+ assert (sha_state != NULL, "wrong version of sun.security.provider.SHA/SHA2");
+ if (sha_state == NULL) return (Node *) NULL;
+
+ // now have the array, need to get the start address of the state array
+ Node* state = array_element_address(sha_state, intcon(0), T_INT);
+ return state;
+}
+
+//------------------------------get_state_from_sha5_object-----------------------
+Node * LibraryCallKit::get_state_from_sha5_object(Node *sha_object) {
+ Node* sha_state = load_field_from_object(sha_object, "state", "[J", /*is_exact*/ false);
+ assert (sha_state != NULL, "wrong version of sun.security.provider.SHA5");
+ if (sha_state == NULL) return (Node *) NULL;
+
+ // now have the array, need to get the start address of the state array
+ Node* state = array_element_address(sha_state, intcon(0), T_LONG);
+ return state;
+}
+
+//----------------------------inline_digestBase_implCompressMB_predicate----------------------------
+// Return node representing slow path of predicate check.
+// the pseudo code we want to emulate with this predicate is:
+// if (digestBaseObj instanceof SHA/SHA2/SHA5) do_intrinsic, else do_javapath
+//
+Node* LibraryCallKit::inline_digestBase_implCompressMB_predicate(int predicate) {
+ assert(UseSHA1Intrinsics || UseSHA256Intrinsics || UseSHA512Intrinsics,
+ "need SHA1/SHA256/SHA512 instruction support");
+ assert((uint)predicate < 3, "sanity");
+
+ // The receiver was checked for NULL already.
+ Node* digestBaseObj = argument(0);
+
+ // get DigestBase klass for instanceOf check
+ const TypeInstPtr* tinst = _gvn.type(digestBaseObj)->isa_instptr();
+ assert(tinst != NULL, "digestBaseObj is null");
+ assert(tinst->klass()->is_loaded(), "DigestBase is not loaded");
+
+ const char* klass_SHA_name = NULL;
+ switch (predicate) {
+ case 0:
+ if (UseSHA1Intrinsics) {
+ // we want to do an instanceof comparison against the SHA class
+ klass_SHA_name = "sun/security/provider/SHA";
+ }
+ break;
+ case 1:
+ if (UseSHA256Intrinsics) {
+ // we want to do an instanceof comparison against the SHA2 class
+ klass_SHA_name = "sun/security/provider/SHA2";
+ }
+ break;
+ case 2:
+ if (UseSHA512Intrinsics) {
+ // we want to do an instanceof comparison against the SHA5 class
+ klass_SHA_name = "sun/security/provider/SHA5";
+ }
+ break;
+ default:
+ fatal(err_msg_res("unknown SHA intrinsic predicate: %d", predicate));
+ }
+
+ ciKlass* klass_SHA = NULL;
+ if (klass_SHA_name != NULL) {
+ klass_SHA = tinst->klass()->as_instance_klass()->find_klass(ciSymbol::make(klass_SHA_name));
+ }
+ if ((klass_SHA == NULL) || !klass_SHA->is_loaded()) {
+ // if none of SHA/SHA2/SHA5 is loaded, we never take the intrinsic fast path
+ Node* ctrl = control();
+ set_control(top()); // no intrinsic path
+ return ctrl;
+ }
+ ciInstanceKlass* instklass_SHA = klass_SHA->as_instance_klass();
+
+ Node* instofSHA = gen_instanceof(digestBaseObj, makecon(TypeKlassPtr::make(instklass_SHA)));
+ Node* cmp_instof = _gvn.transform(new CmpINode(instofSHA, intcon(1)));
+ Node* bool_instof = _gvn.transform(new BoolNode(cmp_instof, BoolTest::ne));
+ Node* instof_false = generate_guard(bool_instof, NULL, PROB_MIN);
+
+ return instof_false; // even if it is NULL
+}
--- a/hotspot/src/share/vm/opto/loopPredicate.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/loopPredicate.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -104,7 +104,7 @@
assert(rgn->is_Call(), "must be call uct");
CallNode* call = rgn->as_Call();
IdealLoopTree* loop = get_loop(call);
- rgn = new (C) RegionNode(1);
+ rgn = new RegionNode(1);
rgn->add_req(uncommon_proj);
register_control(rgn, loop, uncommon_proj);
_igvn.hash_delete(call);
@@ -130,8 +130,8 @@
IfNode *new_iff = iff->clone()->as_If();
new_iff->set_req(0, entry);
register_control(new_iff, lp, entry);
- Node *if_cont = new (C) IfTrueNode(new_iff);
- Node *if_uct = new (C) IfFalseNode(new_iff);
+ Node *if_cont = new IfTrueNode(new_iff);
+ Node *if_uct = new IfFalseNode(new_iff);
if (cont_proj->is_IfFalse()) {
// Swap
Node* tmp = if_uct; if_uct = if_cont; if_cont = tmp;
@@ -191,7 +191,7 @@
if (!rgn->is_Region()) { // create a region to guard the call
assert(rgn->is_Call(), "must be call uct");
CallNode* call = rgn->as_Call();
- rgn = new (C) RegionNode(1);
+ rgn = new RegionNode(1);
register_new_node_with_optimizer(rgn);
rgn->add_req(uncommon_proj);
hash_delete(call);
@@ -208,8 +208,8 @@
new_iff->set_req(0, new_entry);
register_new_node_with_optimizer(new_iff);
- Node *if_cont = new (C) IfTrueNode(new_iff);
- Node *if_uct = new (C) IfFalseNode(new_iff);
+ Node *if_cont = new IfTrueNode(new_iff);
+ Node *if_uct = new IfFalseNode(new_iff);
if (cont_proj->is_IfFalse()) {
// Swap
Node* tmp = if_uct; if_uct = if_cont; if_cont = tmp;
@@ -254,10 +254,10 @@
// Match original condition since predicate's projections could be swapped.
assert(predicate_proj->in(0)->in(1)->in(1)->Opcode()==Op_Opaque1, "must be");
- Node* opq = new (igvn->C) Opaque1Node(igvn->C, predicate_proj->in(0)->in(1)->in(1)->in(1));
+ Node* opq = new Opaque1Node(igvn->C, predicate_proj->in(0)->in(1)->in(1)->in(1));
igvn->C->add_predicate_opaq(opq);
- Node* bol = new (igvn->C) Conv2BNode(opq);
+ Node* bol = new Conv2BNode(opq);
if (loop_phase != NULL) {
loop_phase->register_new_node(opq, ctrl);
loop_phase->register_new_node(bol, ctrl);
@@ -605,11 +605,11 @@
// Calculate exact limit here.
// Note, counted loop's test is '<' or '>'.
limit = exact_limit(loop);
- max_idx_expr = new (C) SubINode(limit, stride);
+ max_idx_expr = new SubINode(limit, stride);
register_new_node(max_idx_expr, ctrl);
if (TraceLoopPredicate) predString->print("(limit - stride) ");
} else {
- max_idx_expr = new (C) SubINode(limit, stride);
+ max_idx_expr = new SubINode(limit, stride);
register_new_node(max_idx_expr, ctrl);
if (TraceLoopPredicate) predString->print("(limit - stride) ");
}
@@ -619,22 +619,22 @@
if (scale != 1) {
ConNode* con_scale = _igvn.intcon(scale);
- max_idx_expr = new (C) MulINode(max_idx_expr, con_scale);
+ max_idx_expr = new MulINode(max_idx_expr, con_scale);
register_new_node(max_idx_expr, ctrl);
if (TraceLoopPredicate) predString->print("* %d ", scale);
}
if (offset && (!offset->is_Con() || offset->get_int() != 0)){
- max_idx_expr = new (C) AddINode(max_idx_expr, offset);
+ max_idx_expr = new AddINode(max_idx_expr, offset);
register_new_node(max_idx_expr, ctrl);
if (TraceLoopPredicate)
if (offset->is_Con()) predString->print("+ %d ", offset->get_int());
else predString->print("+ offset ");
}
- CmpUNode* cmp = new (C) CmpUNode(max_idx_expr, range);
+ CmpUNode* cmp = new CmpUNode(max_idx_expr, range);
register_new_node(cmp, ctrl);
- BoolNode* bol = new (C) BoolNode(cmp, BoolTest::lt);
+ BoolNode* bol = new BoolNode(cmp, BoolTest::lt);
register_new_node(bol, ctrl);
if (TraceLoopPredicate) {
@@ -750,7 +750,7 @@
// Negate test if necessary
bool negated = false;
if (proj->_con != predicate_proj->_con) {
- new_predicate_bol = new (C) BoolNode(new_predicate_bol->in(1), new_predicate_bol->_test.negate());
+ new_predicate_bol = new BoolNode(new_predicate_bol->in(1), new_predicate_bol->_test.negate());
register_new_node(new_predicate_bol, ctrl);
negated = true;
}
--- a/hotspot/src/share/vm/opto/loopTransform.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/loopTransform.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -227,24 +227,24 @@
if (neg_inv1) {
Node *zero = phase->_igvn.intcon(0);
phase->set_ctrl(zero, phase->C->root());
- n_inv1 = new (phase->C) SubINode(zero, inv1);
+ n_inv1 = new SubINode(zero, inv1);
phase->register_new_node(n_inv1, inv1_c);
} else {
n_inv1 = inv1;
}
Node* inv;
if (neg_inv2) {
- inv = new (phase->C) SubINode(n_inv1, inv2);
+ inv = new SubINode(n_inv1, inv2);
} else {
- inv = new (phase->C) AddINode(n_inv1, inv2);
+ inv = new AddINode(n_inv1, inv2);
}
phase->register_new_node(inv, phase->get_early_ctrl(inv));
Node* addx;
if (neg_x) {
- addx = new (phase->C) SubINode(inv, x);
+ addx = new SubINode(inv, x);
} else {
- addx = new (phase->C) AddINode(x, inv);
+ addx = new AddINode(x, inv);
}
phase->register_new_node(addx, phase->get_ctrl(x));
phase->_igvn.replace_node(n1, addx);
@@ -953,7 +953,7 @@
post_end->_prob = PROB_FAIR;
// Build the main-loop normal exit.
- IfFalseNode *new_main_exit = new (C) IfFalseNode(main_end);
+ IfFalseNode *new_main_exit = new IfFalseNode(main_end);
_igvn.register_new_node_with_optimizer( new_main_exit );
set_idom(new_main_exit, main_end, dd_main_exit );
set_loop(new_main_exit, loop->_parent);
@@ -963,15 +963,15 @@
// (the main-loop trip-counter exit value) because we will be changing
// the exit value (via unrolling) so we cannot constant-fold away the zero
// trip guard until all unrolling is done.
- Node *zer_opaq = new (C) Opaque1Node(C, incr);
- Node *zer_cmp = new (C) CmpINode( zer_opaq, limit );
- Node *zer_bol = new (C) BoolNode( zer_cmp, b_test );
+ Node *zer_opaq = new Opaque1Node(C, incr);
+ Node *zer_cmp = new CmpINode( zer_opaq, limit );
+ Node *zer_bol = new BoolNode( zer_cmp, b_test );
register_new_node( zer_opaq, new_main_exit );
register_new_node( zer_cmp , new_main_exit );
register_new_node( zer_bol , new_main_exit );
// Build the IfNode
- IfNode *zer_iff = new (C) IfNode( new_main_exit, zer_bol, PROB_FAIR, COUNT_UNKNOWN );
+ IfNode *zer_iff = new IfNode( new_main_exit, zer_bol, PROB_FAIR, COUNT_UNKNOWN );
_igvn.register_new_node_with_optimizer( zer_iff );
set_idom(zer_iff, new_main_exit, dd_main_exit);
set_loop(zer_iff, loop->_parent);
@@ -981,7 +981,7 @@
set_idom(main_exit, zer_iff, dd_main_exit);
set_idom(main_exit->unique_out(), zer_iff, dd_main_exit);
// Make the true-path, must enter the post loop
- Node *zer_taken = new (C) IfTrueNode( zer_iff );
+ Node *zer_taken = new IfTrueNode( zer_iff );
_igvn.register_new_node_with_optimizer( zer_taken );
set_idom(zer_taken, zer_iff, dd_main_exit);
set_loop(zer_taken, loop->_parent);
@@ -1029,7 +1029,7 @@
// Find the pre-loop normal exit.
Node* pre_exit = pre_end->proj_out(false);
assert( pre_exit->Opcode() == Op_IfFalse, "" );
- IfFalseNode *new_pre_exit = new (C) IfFalseNode(pre_end);
+ IfFalseNode *new_pre_exit = new IfFalseNode(pre_end);
_igvn.register_new_node_with_optimizer( new_pre_exit );
set_idom(new_pre_exit, pre_end, dd_main_head);
set_loop(new_pre_exit, loop->_parent);
@@ -1038,15 +1038,15 @@
// pre-loop, the main-loop may not execute at all. Later in life this
// zero-trip guard will become the minimum-trip guard when we unroll
// the main-loop.
- Node *min_opaq = new (C) Opaque1Node(C, limit);
- Node *min_cmp = new (C) CmpINode( pre_incr, min_opaq );
- Node *min_bol = new (C) BoolNode( min_cmp, b_test );
+ Node *min_opaq = new Opaque1Node(C, limit);
+ Node *min_cmp = new CmpINode( pre_incr, min_opaq );
+ Node *min_bol = new BoolNode( min_cmp, b_test );
register_new_node( min_opaq, new_pre_exit );
register_new_node( min_cmp , new_pre_exit );
register_new_node( min_bol , new_pre_exit );
// Build the IfNode (assume the main-loop is executed always).
- IfNode *min_iff = new (C) IfNode( new_pre_exit, min_bol, PROB_ALWAYS, COUNT_UNKNOWN );
+ IfNode *min_iff = new IfNode( new_pre_exit, min_bol, PROB_ALWAYS, COUNT_UNKNOWN );
_igvn.register_new_node_with_optimizer( min_iff );
set_idom(min_iff, new_pre_exit, dd_main_head);
set_loop(min_iff, loop->_parent);
@@ -1057,7 +1057,7 @@
set_idom(pre_exit, min_iff, dd_main_head);
set_idom(pre_exit->unique_out(), min_iff, dd_main_head);
// Make the true-path, must enter the main loop
- Node *min_taken = new (C) IfTrueNode( min_iff );
+ Node *min_taken = new IfTrueNode( min_iff );
_igvn.register_new_node_with_optimizer( min_taken );
set_idom(min_taken, min_iff, dd_main_head);
set_loop(min_taken, loop->_parent);
@@ -1087,11 +1087,11 @@
// RCE and alignment may change this later.
Node *cmp_end = pre_end->cmp_node();
assert( cmp_end->in(2) == limit, "" );
- Node *pre_limit = new (C) AddINode( init, stride );
+ Node *pre_limit = new AddINode( init, stride );
// Save the original loop limit in this Opaque1 node for
// use by range check elimination.
- Node *pre_opaq = new (C) Opaque1Node(C, pre_limit, limit);
+ Node *pre_opaq = new Opaque1Node(C, pre_limit, limit);
register_new_node( pre_limit, pre_head->in(0) );
register_new_node( pre_opaq , pre_head->in(0) );
@@ -1116,19 +1116,19 @@
BoolTest::mask new_test = (main_end->stride_con() > 0) ? BoolTest::lt : BoolTest::gt;
// Modify pre loop end condition
Node* pre_bol = pre_end->in(CountedLoopEndNode::TestValue)->as_Bool();
- BoolNode* new_bol0 = new (C) BoolNode(pre_bol->in(1), new_test);
+ BoolNode* new_bol0 = new BoolNode(pre_bol->in(1), new_test);
register_new_node( new_bol0, pre_head->in(0) );
_igvn.hash_delete(pre_end);
pre_end->set_req(CountedLoopEndNode::TestValue, new_bol0);
// Modify main loop guard condition
assert(min_iff->in(CountedLoopEndNode::TestValue) == min_bol, "guard okay");
- BoolNode* new_bol1 = new (C) BoolNode(min_bol->in(1), new_test);
+ BoolNode* new_bol1 = new BoolNode(min_bol->in(1), new_test);
register_new_node( new_bol1, new_pre_exit );
_igvn.hash_delete(min_iff);
min_iff->set_req(CountedLoopEndNode::TestValue, new_bol1);
// Modify main loop end condition
BoolNode* main_bol = main_end->in(CountedLoopEndNode::TestValue)->as_Bool();
- BoolNode* new_bol2 = new (C) BoolNode(main_bol->in(1), new_test);
+ BoolNode* new_bol2 = new BoolNode(main_bol->in(1), new_test);
register_new_node( new_bol2, main_end->in(CountedLoopEndNode::TestControl) );
_igvn.hash_delete(main_end);
main_end->set_req(CountedLoopEndNode::TestValue, new_bol2);
@@ -1279,13 +1279,13 @@
// zero trip guard limit will be different from loop limit.
assert(has_ctrl(opaq), "should have it");
Node* opaq_ctrl = get_ctrl(opaq);
- limit = new (C) Opaque2Node( C, limit );
+ limit = new Opaque2Node( C, limit );
register_new_node( limit, opaq_ctrl );
}
if (stride_con > 0 && ((limit_type->_lo - stride_con) < limit_type->_lo) ||
stride_con < 0 && ((limit_type->_hi - stride_con) > limit_type->_hi)) {
// No underflow.
- new_limit = new (C) SubINode(limit, stride);
+ new_limit = new SubINode(limit, stride);
} else {
// (limit - stride) may underflow.
// Clamp the adjustment value with MININT or MAXINT:
@@ -1315,18 +1315,18 @@
old_limit = bol->in(1)->in(1);
// Adjust previous adjusted limit.
adj_limit = limit->in(CMoveNode::IfFalse);
- adj_limit = new (C) SubINode(adj_limit, stride);
+ adj_limit = new SubINode(adj_limit, stride);
} else {
old_limit = limit;
- adj_limit = new (C) SubINode(limit, stride);
+ adj_limit = new SubINode(limit, stride);
}
assert(old_limit != NULL && adj_limit != NULL, "");
register_new_node( adj_limit, ctrl ); // adjust amount
- Node* adj_cmp = new (C) CmpINode(old_limit, adj_limit);
+ Node* adj_cmp = new CmpINode(old_limit, adj_limit);
register_new_node( adj_cmp, ctrl );
- Node* adj_bool = new (C) BoolNode(adj_cmp, bt);
+ Node* adj_bool = new BoolNode(adj_cmp, bt);
register_new_node( adj_bool, ctrl );
- new_limit = new (C) CMoveINode(adj_bool, adj_limit, adj_max, TypeInt::INT);
+ new_limit = new CMoveINode(adj_bool, adj_limit, adj_max, TypeInt::INT);
}
register_new_node(new_limit, ctrl);
}
@@ -1388,24 +1388,24 @@
// CountedLoop this is exact (stride divides limit-init exactly).
// We are going to double the loop body, so we want to knock off any
// odd iteration: (trip_cnt & ~1). Then back compute a new limit.
- Node *span = new (C) SubINode( limit, init );
+ Node *span = new SubINode( limit, init );
register_new_node( span, ctrl );
- Node *trip = new (C) DivINode( 0, span, stride );
+ Node *trip = new DivINode( 0, span, stride );
register_new_node( trip, ctrl );
Node *mtwo = _igvn.intcon(-2);
set_ctrl(mtwo, C->root());
- Node *rond = new (C) AndINode( trip, mtwo );
+ Node *rond = new AndINode( trip, mtwo );
register_new_node( rond, ctrl );
- Node *spn2 = new (C) MulINode( rond, stride );
+ Node *spn2 = new MulINode( rond, stride );
register_new_node( spn2, ctrl );
- new_limit = new (C) AddINode( spn2, init );
+ new_limit = new AddINode( spn2, init );
register_new_node( new_limit, ctrl );
// Hammer in the new limit
Node *ctrl2 = loop_end->in(0);
- Node *cmp2 = new (C) CmpINode( loop_head->incr(), new_limit );
+ Node *cmp2 = new CmpINode( loop_head->incr(), new_limit );
register_new_node( cmp2, ctrl2 );
- Node *bol2 = new (C) BoolNode( cmp2, loop_end->test_trip() );
+ Node *bol2 = new BoolNode( cmp2, loop_end->test_trip() );
register_new_node( bol2, ctrl2 );
_igvn.hash_delete(loop_end);
loop_end->set_req(CountedLoopEndNode::TestValue, bol2);
@@ -1511,15 +1511,15 @@
// Helper function for add_constraint().
Node* PhaseIdealLoop::adjust_limit(int stride_con, Node * scale, Node *offset, Node *rc_limit, Node *loop_limit, Node *pre_ctrl) {
// Compute "I :: (limit-offset)/scale"
- Node *con = new (C) SubINode(rc_limit, offset);
+ Node *con = new SubINode(rc_limit, offset);
register_new_node(con, pre_ctrl);
- Node *X = new (C) DivINode(0, con, scale);
+ Node *X = new DivINode(0, con, scale);
register_new_node(X, pre_ctrl);
// Adjust loop limit
loop_limit = (stride_con > 0)
- ? (Node*)(new (C) MinINode(loop_limit, X))
- : (Node*)(new (C) MaxINode(loop_limit, X));
+ ? (Node*)(new MinINode(loop_limit, X))
+ : (Node*)(new MaxINode(loop_limit, X));
register_new_node(loop_limit, pre_ctrl);
return loop_limit;
}
@@ -1580,9 +1580,9 @@
// to avoid problem with scale == -1 (min_int/(-1) == min_int).
Node* shift = _igvn.intcon(31);
set_ctrl(shift, C->root());
- Node* sign = new (C) RShiftINode(offset, shift);
+ Node* sign = new RShiftINode(offset, shift);
register_new_node(sign, pre_ctrl);
- offset = new (C) AndINode(offset, sign);
+ offset = new AndINode(offset, sign);
register_new_node(offset, pre_ctrl);
} else {
assert(low_limit->get_int() == 0, "wrong low limit for range check");
@@ -1615,7 +1615,7 @@
Node *one = _igvn.intcon(1);
set_ctrl(one, C->root());
- Node *plus_one = new (C) AddINode(offset, one);
+ Node *plus_one = new AddINode(offset, one);
register_new_node( plus_one, pre_ctrl );
// Pass (-stride) to indicate pre_loop_cond = NOT(main_loop_cond);
*pre_limit = adjust_limit((-stride_con), scale, plus_one, upper_limit, *pre_limit, pre_ctrl);
@@ -1633,9 +1633,9 @@
// to avoid problem with scale == -1 (min_int/(-1) == min_int).
Node* shift = _igvn.intcon(31);
set_ctrl(shift, C->root());
- Node* sign = new (C) RShiftINode(plus_one, shift);
+ Node* sign = new RShiftINode(plus_one, shift);
register_new_node(sign, pre_ctrl);
- plus_one = new (C) AndINode(plus_one, sign);
+ plus_one = new AndINode(plus_one, sign);
register_new_node(plus_one, pre_ctrl);
} else {
assert(low_limit->get_int() == 0, "wrong low limit for range check");
@@ -1718,7 +1718,7 @@
p_offset != NULL ? &offset2 : NULL, depth+1)) {
if (p_offset != NULL) {
Node *ctrl_off2 = get_ctrl(offset2);
- Node* offset = new (C) AddINode(offset2, exp->in(2));
+ Node* offset = new AddINode(offset2, exp->in(2));
register_new_node(offset, ctrl_off2);
*p_offset = offset;
}
@@ -1731,7 +1731,7 @@
Node *zero = _igvn.intcon(0);
set_ctrl(zero, C->root());
Node *ctrl_off = get_ctrl(exp->in(2));
- Node* offset = new (C) SubINode(zero, exp->in(2));
+ Node* offset = new SubINode(zero, exp->in(2));
register_new_node(offset, ctrl_off);
*p_offset = offset;
}
@@ -1934,15 +1934,15 @@
case BoolTest::ge:
// Convert (I*scale+offset) >= Limit to (I*(-scale)+(-offset)) <= -Limit
scale_con = -scale_con;
- offset = new (C) SubINode( zero, offset );
+ offset = new SubINode( zero, offset );
register_new_node( offset, pre_ctrl );
- limit = new (C) SubINode( zero, limit );
+ limit = new SubINode( zero, limit );
register_new_node( limit, pre_ctrl );
// Fall into LE case
case BoolTest::le:
if (b_test._test != BoolTest::gt) {
// Convert X <= Y to X < Y+1
- limit = new (C) AddINode( limit, one );
+ limit = new AddINode( limit, one );
register_new_node( limit, pre_ctrl );
}
// Fall into LT case
@@ -1993,8 +1993,8 @@
// Update loop limits
if (conditional_rc) {
- pre_limit = (stride_con > 0) ? (Node*)new (C) MinINode(pre_limit, orig_limit)
- : (Node*)new (C) MaxINode(pre_limit, orig_limit);
+ pre_limit = (stride_con > 0) ? (Node*)new MinINode(pre_limit, orig_limit)
+ : (Node*)new MaxINode(pre_limit, orig_limit);
register_new_node(pre_limit, pre_ctrl);
}
_igvn.hash_delete(pre_opaq);
@@ -2009,16 +2009,16 @@
Node *ctrl = get_ctrl(main_limit);
Node *stride = cl->stride();
Node *init = cl->init_trip();
- Node *span = new (C) SubINode(main_limit,init);
+ Node *span = new SubINode(main_limit,init);
register_new_node(span,ctrl);
Node *rndup = _igvn.intcon(stride_con + ((stride_con>0)?-1:1));
- Node *add = new (C) AddINode(span,rndup);
+ Node *add = new AddINode(span,rndup);
register_new_node(add,ctrl);
- Node *div = new (C) DivINode(0,add,stride);
+ Node *div = new DivINode(0,add,stride);
register_new_node(div,ctrl);
- Node *mul = new (C) MulINode(div,stride);
+ Node *mul = new MulINode(div,stride);
register_new_node(mul,ctrl);
- Node *newlim = new (C) AddINode(mul,init);
+ Node *newlim = new AddINode(mul,init);
register_new_node(newlim,ctrl);
main_limit = newlim;
}
@@ -2189,7 +2189,7 @@
}
// Note: the final value after increment should not overflow since
// counted loop has limit check predicate.
- Node *final = new (phase->C) SubINode( exact_limit, cl->stride() );
+ Node *final = new SubINode( exact_limit, cl->stride() );
phase->register_new_node(final,cl->in(LoopNode::EntryControl));
phase->_igvn.replace_node(phi,final);
phase->C->set_major_progress();
@@ -2676,20 +2676,20 @@
// Build an expression for the beginning of the copy region
Node* index = head->init_trip();
#ifdef _LP64
- index = new (C) ConvI2LNode(index);
+ index = new ConvI2LNode(index);
_igvn.register_new_node_with_optimizer(index);
#endif
if (shift != NULL) {
// byte arrays don't require a shift but others do.
- index = new (C) LShiftXNode(index, shift->in(2));
+ index = new LShiftXNode(index, shift->in(2));
_igvn.register_new_node_with_optimizer(index);
}
- index = new (C) AddPNode(base, base, index);
+ index = new AddPNode(base, base, index);
_igvn.register_new_node_with_optimizer(index);
- Node* from = new (C) AddPNode(base, index, offset);
+ Node* from = new AddPNode(base, index, offset);
_igvn.register_new_node_with_optimizer(from);
// Compute the number of elements to copy
- Node* len = new (C) SubINode(head->limit(), head->init_trip());
+ Node* len = new SubINode(head->limit(), head->init_trip());
_igvn.register_new_node_with_optimizer(len);
BasicType t = store->as_Mem()->memory_type();
@@ -2706,17 +2706,17 @@
// Convert float/double to int/long for fill routines
if (t == T_FLOAT) {
- store_value = new (C) MoveF2INode(store_value);
+ store_value = new MoveF2INode(store_value);
_igvn.register_new_node_with_optimizer(store_value);
} else if (t == T_DOUBLE) {
- store_value = new (C) MoveD2LNode(store_value);
+ store_value = new MoveD2LNode(store_value);
_igvn.register_new_node_with_optimizer(store_value);
}
if (CCallingConventionRequiresIntsAsLongs &&
// See StubRoutines::select_fill_function for types. FLOAT has been converted to INT.
(t == T_FLOAT || t == T_INT || is_subword_type(t))) {
- store_value = new (C) ConvI2LNode(store_value);
+ store_value = new ConvI2LNode(store_value);
_igvn.register_new_node_with_optimizer(store_value);
}
@@ -2724,8 +2724,8 @@
Node* result_ctrl;
Node* result_mem;
const TypeFunc* call_type = OptoRuntime::array_fill_Type();
- CallLeafNode *call = new (C) CallLeafNoFPNode(call_type, fill,
- fill_name, TypeAryPtr::get_array_body_type(t));
+ CallLeafNode *call = new CallLeafNoFPNode(call_type, fill,
+ fill_name, TypeAryPtr::get_array_body_type(t));
uint cnt = 0;
call->init_req(TypeFunc::Parms + cnt++, from);
call->init_req(TypeFunc::Parms + cnt++, store_value);
@@ -2733,7 +2733,7 @@
call->init_req(TypeFunc::Parms + cnt++, C->top());
}
#ifdef _LP64
- len = new (C) ConvI2LNode(len);
+ len = new ConvI2LNode(len);
_igvn.register_new_node_with_optimizer(len);
#endif
call->init_req(TypeFunc::Parms + cnt++, len);
@@ -2746,9 +2746,9 @@
call->init_req(TypeFunc::ReturnAdr, C->start()->proj_out(TypeFunc::ReturnAdr));
call->init_req(TypeFunc::FramePtr, C->start()->proj_out(TypeFunc::FramePtr));
_igvn.register_new_node_with_optimizer(call);
- result_ctrl = new (C) ProjNode(call,TypeFunc::Control);
+ result_ctrl = new ProjNode(call,TypeFunc::Control);
_igvn.register_new_node_with_optimizer(result_ctrl);
- result_mem = new (C) ProjNode(call,TypeFunc::Memory);
+ result_mem = new ProjNode(call,TypeFunc::Memory);
_igvn.register_new_node_with_optimizer(result_mem);
/* Disable following optimization until proper fix (add missing checks).
--- a/hotspot/src/share/vm/opto/loopUnswitch.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/loopUnswitch.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -225,15 +225,15 @@
Node *cont = _igvn.intcon(1);
set_ctrl(cont, C->root());
- Node* opq = new (C) Opaque1Node(C, cont);
+ Node* opq = new Opaque1Node(C, cont);
register_node(opq, outer_loop, entry, dom_depth(entry));
- Node *bol = new (C) Conv2BNode(opq);
+ Node *bol = new Conv2BNode(opq);
register_node(bol, outer_loop, entry, dom_depth(entry));
- IfNode* iff = new (C) IfNode(entry, bol, PROB_MAX, COUNT_UNKNOWN);
+ IfNode* iff = new IfNode(entry, bol, PROB_MAX, COUNT_UNKNOWN);
register_node(iff, outer_loop, entry, dom_depth(entry));
- ProjNode* iffast = new (C) IfTrueNode(iff);
+ ProjNode* iffast = new IfTrueNode(iff);
register_node(iffast, outer_loop, iff, dom_depth(iff));
- ProjNode* ifslow = new (C) IfFalseNode(iff);
+ ProjNode* ifslow = new IfFalseNode(iff);
register_node(ifslow, outer_loop, iff, dom_depth(iff));
// Clone the loop body. The clone becomes the fast loop. The
--- a/hotspot/src/share/vm/opto/loopnode.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/loopnode.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -443,7 +443,7 @@
assert(x->Opcode() == Op_Loop, "regular loops only");
C->print_method(PHASE_BEFORE_CLOOPS, 3);
- Node *hook = new (C) Node(6);
+ Node *hook = new Node(6);
if (LoopLimitCheck) {
@@ -506,11 +506,11 @@
Node* bol;
if (stride_con > 0) {
- cmp_limit = new (C) CmpINode(limit, _igvn.intcon(max_jint - stride_m));
- bol = new (C) BoolNode(cmp_limit, BoolTest::le);
+ cmp_limit = new CmpINode(limit, _igvn.intcon(max_jint - stride_m));
+ bol = new BoolNode(cmp_limit, BoolTest::le);
} else {
- cmp_limit = new (C) CmpINode(limit, _igvn.intcon(min_jint - stride_m));
- bol = new (C) BoolNode(cmp_limit, BoolTest::ge);
+ cmp_limit = new CmpINode(limit, _igvn.intcon(min_jint - stride_m));
+ bol = new BoolNode(cmp_limit, BoolTest::ge);
}
cmp_limit = _igvn.register_new_node_with_optimizer(cmp_limit);
bol = _igvn.register_new_node_with_optimizer(bol);
@@ -547,7 +547,7 @@
// is converted to
// i = init; do {} while(++i < limit+1);
//
- limit = gvn->transform(new (C) AddINode(limit, stride));
+ limit = gvn->transform(new AddINode(limit, stride));
}
// Now we need to canonicalize loop condition.
@@ -566,7 +566,7 @@
// we can convert 'i <= limit' to 'i < limit+1' since stride != 0.
//
Node* one = (stride_con > 0) ? gvn->intcon( 1) : gvn->intcon(-1);
- limit = gvn->transform(new (C) AddINode(limit, one));
+ limit = gvn->transform(new AddINode(limit, one));
if (bt == BoolTest::le)
bt = BoolTest::lt;
else if (bt == BoolTest::ge)
@@ -582,7 +582,7 @@
// can directly point to the phi; in this case adjust the compare so that
// it points to the incr by adjusting the limit.
if (cmp->in(1) == phi || cmp->in(2) == phi)
- limit = gvn->transform(new (C) AddINode(limit,stride));
+ limit = gvn->transform(new AddINode(limit,stride));
// trip-count for +-tive stride should be: (limit - init_trip + stride - 1)/stride.
// Final value for iterator should be: trip_count * stride + init_trip.
@@ -595,16 +595,16 @@
ShouldNotReachHere();
case BoolTest::ne: // Ahh, the case we desire
if (stride_con == 1)
- trip_count = gvn->transform(new (C) SubINode(limit,init_trip));
+ trip_count = gvn->transform(new SubINode(limit,init_trip));
else if (stride_con == -1)
- trip_count = gvn->transform(new (C) SubINode(init_trip,limit));
+ trip_count = gvn->transform(new SubINode(init_trip,limit));
else
ShouldNotReachHere();
set_subtree_ctrl(trip_count);
//_loop.map(trip_count->_idx,loop(limit));
break;
case BoolTest::le: // Maybe convert to '<' case
- limit = gvn->transform(new (C) AddINode(limit,one_p));
+ limit = gvn->transform(new AddINode(limit,one_p));
set_subtree_ctrl( limit );
hook->init_req(4, limit);
@@ -615,26 +615,26 @@
case BoolTest::lt: { // Maybe convert to '!=' case
if (stride_con < 0) // Count down loop rolls through MAXINT
ShouldNotReachHere();
- Node *range = gvn->transform(new (C) SubINode(limit,init_trip));
+ Node *range = gvn->transform(new SubINode(limit,init_trip));
set_subtree_ctrl( range );
hook->init_req(0, range);
- Node *bias = gvn->transform(new (C) AddINode(range,stride));
+ Node *bias = gvn->transform(new AddINode(range,stride));
set_subtree_ctrl( bias );
hook->init_req(1, bias);
- Node *bias1 = gvn->transform(new (C) AddINode(bias,one_m));
+ Node *bias1 = gvn->transform(new AddINode(bias,one_m));
set_subtree_ctrl( bias1 );
hook->init_req(2, bias1);
- trip_count = gvn->transform(new (C) DivINode(0,bias1,stride));
+ trip_count = gvn->transform(new DivINode(0,bias1,stride));
set_subtree_ctrl( trip_count );
hook->init_req(3, trip_count);
break;
}
case BoolTest::ge: // Maybe convert to '>' case
- limit = gvn->transform(new (C) AddINode(limit,one_m));
+ limit = gvn->transform(new AddINode(limit,one_m));
set_subtree_ctrl( limit );
hook->init_req(4 ,limit);
@@ -645,30 +645,30 @@
case BoolTest::gt: { // Maybe convert to '!=' case
if (stride_con > 0) // count up loop rolls through MININT
ShouldNotReachHere();
- Node *range = gvn->transform(new (C) SubINode(limit,init_trip));
+ Node *range = gvn->transform(new SubINode(limit,init_trip));
set_subtree_ctrl( range );
hook->init_req(0, range);
- Node *bias = gvn->transform(new (C) AddINode(range,stride));
+ Node *bias = gvn->transform(new AddINode(range,stride));
set_subtree_ctrl( bias );
hook->init_req(1, bias);
- Node *bias1 = gvn->transform(new (C) AddINode(bias,one_p));
+ Node *bias1 = gvn->transform(new AddINode(bias,one_p));
set_subtree_ctrl( bias1 );
hook->init_req(2, bias1);
- trip_count = gvn->transform(new (C) DivINode(0,bias1,stride));
+ trip_count = gvn->transform(new DivINode(0,bias1,stride));
set_subtree_ctrl( trip_count );
hook->init_req(3, trip_count);
break;
}
} // switch( bt )
- Node *span = gvn->transform(new (C) MulINode(trip_count,stride));
+ Node *span = gvn->transform(new MulINode(trip_count,stride));
set_subtree_ctrl( span );
hook->init_req(5, span);
- limit = gvn->transform(new (C) AddINode(span,init_trip));
+ limit = gvn->transform(new AddINode(span,init_trip));
set_subtree_ctrl( limit );
} // LoopLimitCheck
@@ -717,7 +717,7 @@
set_ctrl(test, iff->in(0));
// Replace the old IfNode with a new LoopEndNode
- Node *lex = _igvn.register_new_node_with_optimizer(new (C) CountedLoopEndNode( iff->in(0), test, cl_prob, iff->as_If()->_fcnt ));
+ Node *lex = _igvn.register_new_node_with_optimizer(new CountedLoopEndNode( iff->in(0), test, cl_prob, iff->as_If()->_fcnt ));
IfNode *le = lex->as_If();
uint dd = dom_depth(iff);
set_idom(le, le->in(0), dd); // Update dominance for loop exit
@@ -728,8 +728,8 @@
// Need to swap loop-exit and loop-back control?
if (iftrue_op == Op_IfFalse) {
- Node *ift2=_igvn.register_new_node_with_optimizer(new (C) IfTrueNode (le));
- Node *iff2=_igvn.register_new_node_with_optimizer(new (C) IfFalseNode(le));
+ Node *ift2=_igvn.register_new_node_with_optimizer(new IfTrueNode (le));
+ Node *iff2=_igvn.register_new_node_with_optimizer(new IfFalseNode(le));
loop->_tail = back_control = ift2;
set_loop(ift2, loop);
@@ -755,7 +755,7 @@
lazy_replace( iff, le ); // fix 'get_ctrl'
// Now setup a new CountedLoopNode to replace the existing LoopNode
- CountedLoopNode *l = new (C) CountedLoopNode(init_control, back_control);
+ CountedLoopNode *l = new CountedLoopNode(init_control, back_control);
l->set_unswitch_count(x->as_Loop()->unswitch_count()); // Preserve
// The following assert is approximately true, and defines the intention
// of can_be_counted_loop. It fails, however, because phase->type
@@ -829,7 +829,7 @@
limit = _igvn.intcon(final_int);
} else {
// Create new LoopLimit node to get exact limit (final iv value).
- limit = new (C) LoopLimitNode(C, cl->init_trip(), cl->limit(), cl->stride());
+ limit = new LoopLimitNode(C, cl->init_trip(), cl->limit(), cl->stride());
register_new_node(limit, cl->in(LoopNode::EntryControl));
}
assert(limit != NULL, "sanity");
@@ -946,11 +946,11 @@
if (range <= max) {
// Convert to integer expression if it is not overflow.
Node* stride_m = phase->intcon(stride_con - (stride_con > 0 ? 1 : -1));
- Node *range = phase->transform(new (phase->C) SubINode(in(Limit), in(Init)));
- Node *bias = phase->transform(new (phase->C) AddINode(range, stride_m));
- Node *trip = phase->transform(new (phase->C) DivINode(0, bias, in(Stride)));
- Node *span = phase->transform(new (phase->C) MulINode(trip, in(Stride)));
- return new (phase->C) AddINode(span, in(Init)); // exact limit
+ Node *range = phase->transform(new SubINode(in(Limit), in(Init)));
+ Node *bias = phase->transform(new AddINode(range, stride_m));
+ Node *trip = phase->transform(new DivINode(0, bias, in(Stride)));
+ Node *span = phase->transform(new MulINode(trip, in(Stride)));
+ return new AddINode(span, in(Init)); // exact limit
}
if (is_power_of_2(stride_p) || // divisor is 2^n
@@ -958,13 +958,13 @@
// Convert to long expression to avoid integer overflow
// and let igvn optimizer convert this division.
//
- Node* init = phase->transform( new (phase->C) ConvI2LNode(in(Init)));
- Node* limit = phase->transform( new (phase->C) ConvI2LNode(in(Limit)));
+ Node* init = phase->transform( new ConvI2LNode(in(Init)));
+ Node* limit = phase->transform( new ConvI2LNode(in(Limit)));
Node* stride = phase->longcon(stride_con);
Node* stride_m = phase->longcon(stride_con - (stride_con > 0 ? 1 : -1));
- Node *range = phase->transform(new (phase->C) SubLNode(limit, init));
- Node *bias = phase->transform(new (phase->C) AddLNode(range, stride_m));
+ Node *range = phase->transform(new SubLNode(limit, init));
+ Node *bias = phase->transform(new AddLNode(range, stride_m));
Node *span;
if (stride_con > 0 && is_power_of_2(stride_p)) {
// bias >= 0 if stride >0, so if stride is 2^n we can use &(-stride)
@@ -975,14 +975,14 @@
// only RCE predicate where exact limit is used and the predicate
// will simply fail forcing recompilation.
Node* neg_stride = phase->longcon(-stride_con);
- span = phase->transform(new (phase->C) AndLNode(bias, neg_stride));
+ span = phase->transform(new AndLNode(bias, neg_stride));
} else {
- Node *trip = phase->transform(new (phase->C) DivLNode(0, bias, stride));
- span = phase->transform(new (phase->C) MulLNode(trip, stride));
+ Node *trip = phase->transform(new DivLNode(0, bias, stride));
+ span = phase->transform(new MulLNode(trip, stride));
}
// Convert back to int
- Node *span_int = phase->transform(new (phase->C) ConvL2INode(span));
- return new (phase->C) AddINode(span_int, in(Init)); // exact limit
+ Node *span_int = phase->transform(new ConvL2INode(span));
+ return new AddINode(span_int, in(Init)); // exact limit
}
return NULL; // No progress
@@ -1188,7 +1188,7 @@
uint i;
// Make a new RegionNode to be the landing pad.
- Node *landing_pad = new (phase->C) RegionNode( fall_in_cnt+1 );
+ Node *landing_pad = new RegionNode( fall_in_cnt+1 );
phase->set_loop(landing_pad,_parent);
// Gather all the fall-in control paths into the landing pad
uint icnt = fall_in_cnt;
@@ -1274,7 +1274,7 @@
// Make a LoopNode for the outermost loop.
Node *ctl = _head->in(LoopNode::EntryControl);
- Node *outer = new (phase->C) LoopNode( ctl, _head->in(outer_idx) );
+ Node *outer = new LoopNode( ctl, _head->in(outer_idx) );
outer = igvn.register_new_node_with_optimizer(outer, _head);
phase->set_created_loop_node();
@@ -1388,7 +1388,7 @@
Node *hot_tail = NULL;
// Make a Region for the merge point
- Node *r = new (phase->C) RegionNode(1);
+ Node *r = new RegionNode(1);
for( i = 2; i < _head->req(); i++ ) {
if( i != hot_idx )
r->add_req( _head->in(i) );
@@ -1407,7 +1407,7 @@
PhiNode* n = out->as_Phi();
igvn.hash_delete(n); // Delete from hash before hacking edges
Node *hot_phi = NULL;
- Node *phi = new (phase->C) PhiNode(r, n->type(), n->adr_type());
+ Node *phi = new PhiNode(r, n->type(), n->adr_type());
// Check all inputs for the ones to peel out
uint j = 1;
for( uint i = 2; i < n->req(); i++ ) {
@@ -1529,7 +1529,7 @@
} else if (!_head->is_Loop() && !_irreducible) {
// Make a new LoopNode to replace the old loop head
- Node *l = new (phase->C) LoopNode( _head->in(1), _head->in(2) );
+ Node *l = new LoopNode( _head->in(1), _head->in(2) );
l = igvn.register_new_node_with_optimizer(l, _head);
phase->set_created_loop_node();
// Go ahead and replace _head
@@ -1771,16 +1771,16 @@
// It is scaled by the 'ratio_con'.
Node* ratio = _igvn.intcon(ratio_con);
set_ctrl(ratio, C->root());
- Node* ratio_init = new (C) MulINode(init, ratio);
+ Node* ratio_init = new MulINode(init, ratio);
_igvn.register_new_node_with_optimizer(ratio_init, init);
set_early_ctrl(ratio_init);
- Node* diff = new (C) SubINode(init2, ratio_init);
+ Node* diff = new SubINode(init2, ratio_init);
_igvn.register_new_node_with_optimizer(diff, init2);
set_early_ctrl(diff);
- Node* ratio_idx = new (C) MulINode(phi, ratio);
+ Node* ratio_idx = new MulINode(phi, ratio);
_igvn.register_new_node_with_optimizer(ratio_idx, phi);
set_ctrl(ratio_idx, cl);
- Node* add = new (C) AddINode(ratio_idx, diff);
+ Node* add = new AddINode(ratio_idx, diff);
_igvn.register_new_node_with_optimizer(add);
set_ctrl(add, cl);
_igvn.replace_node( phi2, add );
@@ -2888,10 +2888,10 @@
if (!_verify_only) {
// Insert the NeverBranch between 'm' and it's control user.
- NeverBranchNode *iff = new (C) NeverBranchNode( m );
+ NeverBranchNode *iff = new NeverBranchNode( m );
_igvn.register_new_node_with_optimizer(iff);
set_loop(iff, l);
- Node *if_t = new (C) CProjNode( iff, 0 );
+ Node *if_t = new CProjNode( iff, 0 );
_igvn.register_new_node_with_optimizer(if_t);
set_loop(if_t, l);
@@ -2907,16 +2907,16 @@
cfg->set_req( k, if_t ); // Now point to NeverBranch
// Now create the never-taken loop exit
- Node *if_f = new (C) CProjNode( iff, 1 );
+ Node *if_f = new CProjNode( iff, 1 );
_igvn.register_new_node_with_optimizer(if_f);
set_loop(if_f, l);
// Find frame ptr for Halt. Relies on the optimizer
// V-N'ing. Easier and quicker than searching through
// the program structure.
- Node *frame = new (C) ParmNode( C->start(), TypeFunc::FramePtr );
+ Node *frame = new ParmNode( C->start(), TypeFunc::FramePtr );
_igvn.register_new_node_with_optimizer(frame);
// Halt & Catch Fire
- Node *halt = new (C) HaltNode( if_f, frame );
+ Node *halt = new HaltNode( if_f, frame );
_igvn.register_new_node_with_optimizer(halt);
set_loop(halt, l);
C->root()->add_req(halt);
--- a/hotspot/src/share/vm/opto/loopopts.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/loopopts.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -56,7 +56,7 @@
int iid = t_oop->instance_id();
int index = C->get_alias_index(t_oop);
int offset = t_oop->offset();
- phi = new (C) PhiNode(region, type, NULL, iid, index, offset);
+ phi = new PhiNode(region, type, NULL, iid, index, offset);
} else {
phi = PhiNode::make_blank(region, n);
}
@@ -363,9 +363,9 @@
_igvn.type( add->in(1) ) != TypeInt::ZERO ) {
Node *zero = _igvn.intcon(0);
set_ctrl(zero, C->root());
- Node *neg = new (C) SubINode( _igvn.intcon(0), add->in(2) );
+ Node *neg = new SubINode( _igvn.intcon(0), add->in(2) );
register_new_node( neg, get_ctrl(add->in(2) ) );
- add = new (C) AddINode( add->in(1), neg );
+ add = new AddINode( add->in(1), neg );
register_new_node( add, add_ctrl );
}
if( add->Opcode() != Op_AddI ) return NULL;
@@ -391,14 +391,14 @@
return NULL; // No invariant part of the add?
// Yes! Reshape address expression!
- Node *inv_scale = new (C) LShiftINode( add_invar, scale );
+ Node *inv_scale = new LShiftINode( add_invar, scale );
Node *inv_scale_ctrl =
dom_depth(add_invar_ctrl) > dom_depth(scale_ctrl) ?
add_invar_ctrl : scale_ctrl;
register_new_node( inv_scale, inv_scale_ctrl );
- Node *var_scale = new (C) LShiftINode( add_var, scale );
+ Node *var_scale = new LShiftINode( add_var, scale );
register_new_node( var_scale, n_ctrl );
- Node *var_add = new (C) AddINode( var_scale, inv_scale );
+ Node *var_add = new AddINode( var_scale, inv_scale );
register_new_node( var_add, n_ctrl );
_igvn.replace_node( n, var_add );
return var_add;
@@ -430,10 +430,10 @@
IdealLoopTree *n23_loop = get_loop( n23_ctrl );
if( n22loop != n_loop && n22loop->is_member(n_loop) &&
n23_loop == n_loop ) {
- Node *add1 = new (C) AddPNode( n->in(1), n->in(2)->in(2), n->in(3) );
+ Node *add1 = new AddPNode( n->in(1), n->in(2)->in(2), n->in(3) );
// Stuff new AddP in the loop preheader
register_new_node( add1, n_loop->_head->in(LoopNode::EntryControl) );
- Node *add2 = new (C) AddPNode( n->in(1), add1, n->in(2)->in(3) );
+ Node *add2 = new AddPNode( n->in(1), add1, n->in(2)->in(3) );
register_new_node( add2, n_ctrl );
_igvn.replace_node( n, add2 );
return add2;
@@ -451,10 +451,10 @@
Node *tmp = V; V = I; I = tmp;
}
if( !is_member(n_loop,get_ctrl(I)) ) {
- Node *add1 = new (C) AddPNode( n->in(1), n->in(2), I );
+ Node *add1 = new AddPNode( n->in(1), n->in(2), I );
// Stuff new AddP in the loop preheader
register_new_node( add1, n_loop->_head->in(LoopNode::EntryControl) );
- Node *add2 = new (C) AddPNode( n->in(1), add1, V );
+ Node *add2 = new AddPNode( n->in(1), add1, V );
register_new_node( add2, n_ctrl );
_igvn.replace_node( n, add2 );
return add2;
@@ -1104,8 +1104,8 @@
Node *sample_cmp = sample_bool->in(1);
// Make Phis to merge the Cmp's inputs.
- PhiNode *phi1 = new (C) PhiNode( phi->in(0), Type::TOP );
- PhiNode *phi2 = new (C) PhiNode( phi->in(0), Type::TOP );
+ PhiNode *phi1 = new PhiNode( phi->in(0), Type::TOP );
+ PhiNode *phi2 = new PhiNode( phi->in(0), Type::TOP );
for( i = 1; i < phi->req(); i++ ) {
Node *n1 = phi->in(i)->in(1)->in(1);
Node *n2 = phi->in(i)->in(1)->in(2);
@@ -1172,8 +1172,8 @@
Node *sample_cmp = phi->in(1);
// Make Phis to merge the Cmp's inputs.
- PhiNode *phi1 = new (C) PhiNode( phi->in(0), Type::TOP );
- PhiNode *phi2 = new (C) PhiNode( phi->in(0), Type::TOP );
+ PhiNode *phi1 = new PhiNode( phi->in(0), Type::TOP );
+ PhiNode *phi2 = new PhiNode( phi->in(0), Type::TOP );
for( uint j = 1; j < phi->req(); j++ ) {
Node *cmp_top = phi->in(j); // Inputs are all Cmp or TOP
Node *n1, *n2;
@@ -1337,7 +1337,7 @@
// We need a Region to merge the exit from the peeled body and the
// exit from the old loop body.
- RegionNode *r = new (C) RegionNode(3);
+ RegionNode *r = new RegionNode(3);
// Map the old use to the new merge point
old_new.map( use->_idx, r );
uint dd_r = MIN2(dom_depth(newuse),dom_depth(use));
@@ -1403,7 +1403,8 @@
// loop. Happens if people set a loop-exit flag; then test the flag
// in the loop to break the loop, then test is again outside of the
// loop to determine which way the loop exited.
- if( use->is_If() || use->is_CMove() ) {
+ // Loop predicate If node connects to Bool node through Opaque1 node.
+ if (use->is_If() || use->is_CMove() || C->is_predicate_opaq(use)) {
// Since this code is highly unlikely, we lazily build the worklist
// of such Nodes to go split.
if( !split_if_set )
@@ -1684,13 +1685,13 @@
ProjNode* proj2 = proj_clone(proj, iff);
register_node(proj2, loop, iff, ddepth);
- Node* cmp = Signed ? (Node*) new (C)CmpINode(left, right) : (Node*) new (C)CmpUNode(left, right);
+ Node* cmp = Signed ? (Node*) new CmpINode(left, right) : (Node*) new CmpUNode(left, right);
register_node(cmp, loop, proj2, ddepth);
- BoolNode* bol = new (C)BoolNode(cmp, relop);
+ BoolNode* bol = new BoolNode(cmp, relop);
register_node(bol, loop, proj2, ddepth);
- IfNode* new_if = new (C)IfNode(proj2, bol, iff->_prob, iff->_fcnt);
+ IfNode* new_if = new IfNode(proj2, bol, iff->_prob, iff->_fcnt);
register_node(new_if, loop, proj2, ddepth);
proj->set_req(0, new_if); // reattach
@@ -1742,11 +1743,11 @@
ProjNode* proj2 = proj_clone(proj, iff);
register_node(proj2, loop, iff, ddepth);
- RegionNode* reg = new (C)RegionNode(2);
+ RegionNode* reg = new RegionNode(2);
reg->set_req(1, proj2);
register_node(reg, loop, iff, ddepth);
- IfNode* dum_if = new (C)IfNode(reg, short_circuit_if(NULL, proj), iff->_prob, iff->_fcnt);
+ IfNode* dum_if = new IfNode(reg, short_circuit_if(NULL, proj), iff->_prob, iff->_fcnt);
register_node(dum_if, loop, reg, ddepth);
proj->set_req(0, dum_if); // reattach
@@ -2569,7 +2570,7 @@
// Create new loop head for new phis and to hang
// the nodes being moved (sinked) from the peel region.
- LoopNode* new_head = new (C) LoopNode(last_peel, last_peel);
+ LoopNode* new_head = new LoopNode(last_peel, last_peel);
new_head->set_unswitch_count(head->unswitch_count()); // Preserve
_igvn.register_new_node_with_optimizer(new_head);
assert(first_not_peeled->in(0) == last_peel, "last_peel <- first_not_peeled");
@@ -2769,12 +2770,12 @@
if (dom_lca(exit, u_ctrl) != exit) continue;
// Hit! Refactor use to use the post-incremented tripcounter.
// Compute a post-increment tripcounter.
- Node *opaq = new (C) Opaque2Node( C, cle->incr() );
- register_new_node( opaq, u_ctrl );
+ Node *opaq = new Opaque2Node( C, cle->incr() );
+ register_new_node(opaq, exit);
Node *neg_stride = _igvn.intcon(-cle->stride_con());
set_ctrl(neg_stride, C->root());
- Node *post = new (C) AddINode( opaq, neg_stride);
- register_new_node( post, u_ctrl );
+ Node *post = new AddINode( opaq, neg_stride);
+ register_new_node(post, exit);
_igvn.rehash_node_delayed(use);
for (uint j = 1; j < use->req(); j++) {
if (use->in(j) == phi)
--- a/hotspot/src/share/vm/opto/machnode.hpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/machnode.hpp Wed Jul 05 19:46:31 2017 +0200
@@ -60,7 +60,10 @@
class MachOper : public ResourceObj {
public:
// Allocate right next to the MachNodes in the same arena
- void *operator new( size_t x, Compile* C ) throw() { return C->node_arena()->Amalloc_D(x); }
+ void *operator new(size_t x) throw() {
+ Compile* C = Compile::current();
+ return C->node_arena()->Amalloc_D(x);
+ }
// Opcode
virtual uint opcode() const = 0;
--- a/hotspot/src/share/vm/opto/macro.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/macro.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -108,20 +108,20 @@
Node* PhaseMacroExpand::opt_bits_test(Node* ctrl, Node* region, int edge, Node* word, int mask, int bits, bool return_fast_path) {
Node* cmp;
if (mask != 0) {
- Node* and_node = transform_later(new (C) AndXNode(word, MakeConX(mask)));
- cmp = transform_later(new (C) CmpXNode(and_node, MakeConX(bits)));
+ Node* and_node = transform_later(new AndXNode(word, MakeConX(mask)));
+ cmp = transform_later(new CmpXNode(and_node, MakeConX(bits)));
} else {
cmp = word;
}
- Node* bol = transform_later(new (C) BoolNode(cmp, BoolTest::ne));
- IfNode* iff = new (C) IfNode( ctrl, bol, PROB_MIN, COUNT_UNKNOWN );
+ Node* bol = transform_later(new BoolNode(cmp, BoolTest::ne));
+ IfNode* iff = new IfNode( ctrl, bol, PROB_MIN, COUNT_UNKNOWN );
transform_later(iff);
// Fast path taken.
- Node *fast_taken = transform_later( new (C) IfFalseNode(iff) );
+ Node *fast_taken = transform_later(new IfFalseNode(iff));
// Fast path not-taken, i.e. slow path
- Node *slow_taken = transform_later( new (C) IfTrueNode(iff) );
+ Node *slow_taken = transform_later(new IfTrueNode(iff));
if (return_fast_path) {
region->init_req(edge, slow_taken); // Capture slow-control
@@ -147,8 +147,8 @@
// Slow-path call
CallNode *call = leaf_name
- ? (CallNode*)new (C) CallLeafNode ( slow_call_type, slow_call, leaf_name, TypeRawPtr::BOTTOM )
- : (CallNode*)new (C) CallStaticJavaNode( slow_call_type, slow_call, OptoRuntime::stub_name(slow_call), oldcall->jvms()->bci(), TypeRawPtr::BOTTOM );
+ ? (CallNode*)new CallLeafNode ( slow_call_type, slow_call, leaf_name, TypeRawPtr::BOTTOM )
+ : (CallNode*)new CallStaticJavaNode( slow_call_type, slow_call, OptoRuntime::stub_name(slow_call), oldcall->jvms()->bci(), TypeRawPtr::BOTTOM );
// Slow path call has no side-effects, uses few values
copy_predefined_input_for_runtime_call(slow_path, oldcall, call );
@@ -423,7 +423,7 @@
GrowableArray <Node *> values(length, length, NULL, false);
// create a new Phi for the value
- PhiNode *phi = new (C) PhiNode(mem->in(0), phi_type, NULL, instance_id, alias_idx, offset);
+ PhiNode *phi = new PhiNode(mem->in(0), phi_type, NULL, instance_id, alias_idx, offset);
transform_later(phi);
value_phis->push(phi, mem->_idx);
@@ -735,7 +735,7 @@
// of regular debuginfo at the last (youngest) JVMS.
// Record relative start index.
uint first_ind = (sfpt->req() - sfpt->jvms()->scloff());
- SafePointScalarObjectNode* sobj = new (C) SafePointScalarObjectNode(res_type,
+ SafePointScalarObjectNode* sobj = new SafePointScalarObjectNode(res_type,
#ifdef ASSERT
alloc,
#endif
@@ -843,7 +843,7 @@
if (field_val->is_EncodeP()) {
field_val = field_val->in(1);
} else {
- field_val = transform_later(new (C) DecodeNNode(field_val, field_val->get_ptr_type()));
+ field_val = transform_later(new DecodeNNode(field_val, field_val->get_ptr_type()));
}
}
sfpt->add_req(field_val);
@@ -1069,7 +1069,7 @@
//---------------------------set_eden_pointers-------------------------
void PhaseMacroExpand::set_eden_pointers(Node* &eden_top_adr, Node* &eden_end_adr) {
if (UseTLAB) { // Private allocation: load from TLS
- Node* thread = transform_later(new (C) ThreadLocalNode());
+ Node* thread = transform_later(new ThreadLocalNode());
int tlab_top_offset = in_bytes(JavaThread::tlab_top_offset());
int tlab_end_offset = in_bytes(JavaThread::tlab_end_offset());
eden_top_adr = basic_plus_adr(top()/*not oop*/, thread, tlab_top_offset);
@@ -1205,18 +1205,18 @@
assert (initial_slow_test == NULL || !always_slow, "arguments must be consistent");
// generate the initial test if necessary
if (initial_slow_test != NULL ) {
- slow_region = new (C) RegionNode(3);
+ slow_region = new RegionNode(3);
// Now make the initial failure test. Usually a too-big test but
// might be a TRUE for finalizers or a fancy class check for
// newInstance0.
- IfNode *toobig_iff = new (C) IfNode(ctrl, initial_slow_test, PROB_MIN, COUNT_UNKNOWN);
+ IfNode *toobig_iff = new IfNode(ctrl, initial_slow_test, PROB_MIN, COUNT_UNKNOWN);
transform_later(toobig_iff);
// Plug the failing-too-big test into the slow-path region
- Node *toobig_true = new (C) IfTrueNode( toobig_iff );
+ Node *toobig_true = new IfTrueNode( toobig_iff );
transform_later(toobig_true);
slow_region ->init_req( too_big_or_final_path, toobig_true );
- toobig_false = new (C) IfFalseNode( toobig_iff );
+ toobig_false = new IfFalseNode( toobig_iff );
transform_later(toobig_false);
} else { // No initial test, just fall into next case
toobig_false = ctrl;
@@ -1249,10 +1249,10 @@
Node *eden_end = make_load(ctrl, mem, eden_end_adr, 0, TypeRawPtr::BOTTOM, T_ADDRESS);
// allocate the Region and Phi nodes for the result
- result_region = new (C) RegionNode(3);
- result_phi_rawmem = new (C) PhiNode(result_region, Type::MEMORY, TypeRawPtr::BOTTOM);
- result_phi_rawoop = new (C) PhiNode(result_region, TypeRawPtr::BOTTOM);
- result_phi_i_o = new (C) PhiNode(result_region, Type::ABIO); // I/O is used for Prefetch
+ result_region = new RegionNode(3);
+ result_phi_rawmem = new PhiNode(result_region, Type::MEMORY, TypeRawPtr::BOTTOM);
+ result_phi_rawoop = new PhiNode(result_region, TypeRawPtr::BOTTOM);
+ result_phi_i_o = new PhiNode(result_region, Type::ABIO); // I/O is used for Prefetch
// We need a Region for the loop-back contended case.
enum { fall_in_path = 1, contended_loopback_path = 2 };
@@ -1262,8 +1262,8 @@
contended_region = toobig_false;
contended_phi_rawmem = mem;
} else {
- contended_region = new (C) RegionNode(3);
- contended_phi_rawmem = new (C) PhiNode(contended_region, Type::MEMORY, TypeRawPtr::BOTTOM);
+ contended_region = new RegionNode(3);
+ contended_phi_rawmem = new PhiNode(contended_region, Type::MEMORY, TypeRawPtr::BOTTOM);
// Now handle the passing-too-big test. We fall into the contended
// loop-back merge point.
contended_region ->init_req(fall_in_path, toobig_false);
@@ -1275,23 +1275,23 @@
// Load(-locked) the heap top.
// See note above concerning the control input when using a TLAB
Node *old_eden_top = UseTLAB
- ? new (C) LoadPNode (ctrl, contended_phi_rawmem, eden_top_adr, TypeRawPtr::BOTTOM, TypeRawPtr::BOTTOM, MemNode::unordered)
- : new (C) LoadPLockedNode(contended_region, contended_phi_rawmem, eden_top_adr, MemNode::acquire);
+ ? new LoadPNode (ctrl, contended_phi_rawmem, eden_top_adr, TypeRawPtr::BOTTOM, TypeRawPtr::BOTTOM, MemNode::unordered)
+ : new LoadPLockedNode(contended_region, contended_phi_rawmem, eden_top_adr, MemNode::acquire);
transform_later(old_eden_top);
// Add to heap top to get a new heap top
- Node *new_eden_top = new (C) AddPNode(top(), old_eden_top, size_in_bytes);
+ Node *new_eden_top = new AddPNode(top(), old_eden_top, size_in_bytes);
transform_later(new_eden_top);
// Check for needing a GC; compare against heap end
- Node *needgc_cmp = new (C) CmpPNode(new_eden_top, eden_end);
+ Node *needgc_cmp = new CmpPNode(new_eden_top, eden_end);
transform_later(needgc_cmp);
- Node *needgc_bol = new (C) BoolNode(needgc_cmp, BoolTest::ge);
+ Node *needgc_bol = new BoolNode(needgc_cmp, BoolTest::ge);
transform_later(needgc_bol);
- IfNode *needgc_iff = new (C) IfNode(contended_region, needgc_bol, PROB_UNLIKELY_MAG(4), COUNT_UNKNOWN);
+ IfNode *needgc_iff = new IfNode(contended_region, needgc_bol, PROB_UNLIKELY_MAG(4), COUNT_UNKNOWN);
transform_later(needgc_iff);
// Plug the failing-heap-space-need-gc test into the slow-path region
- Node *needgc_true = new (C) IfTrueNode(needgc_iff);
+ Node *needgc_true = new IfTrueNode(needgc_iff);
transform_later(needgc_true);
if (initial_slow_test) {
slow_region->init_req(need_gc_path, needgc_true);
@@ -1302,7 +1302,7 @@
slow_region = needgc_true;
}
// No need for a GC. Setup for the Store-Conditional
- Node *needgc_false = new (C) IfFalseNode(needgc_iff);
+ Node *needgc_false = new IfFalseNode(needgc_iff);
transform_later(needgc_false);
// Grab regular I/O before optional prefetch may change it.
@@ -1322,37 +1322,37 @@
// memory state.
if (UseTLAB) {
Node* store_eden_top =
- new (C) StorePNode(needgc_false, contended_phi_rawmem, eden_top_adr,
+ new StorePNode(needgc_false, contended_phi_rawmem, eden_top_adr,
TypeRawPtr::BOTTOM, new_eden_top, MemNode::unordered);
transform_later(store_eden_top);
fast_oop_ctrl = needgc_false; // No contention, so this is the fast path
fast_oop_rawmem = store_eden_top;
} else {
Node* store_eden_top =
- new (C) StorePConditionalNode(needgc_false, contended_phi_rawmem, eden_top_adr,
+ new StorePConditionalNode(needgc_false, contended_phi_rawmem, eden_top_adr,
new_eden_top, fast_oop/*old_eden_top*/);
transform_later(store_eden_top);
- Node *contention_check = new (C) BoolNode(store_eden_top, BoolTest::ne);
+ Node *contention_check = new BoolNode(store_eden_top, BoolTest::ne);
transform_later(contention_check);
- store_eden_top = new (C) SCMemProjNode(store_eden_top);
+ store_eden_top = new SCMemProjNode(store_eden_top);
transform_later(store_eden_top);
// If not using TLABs, check to see if there was contention.
- IfNode *contention_iff = new (C) IfNode (needgc_false, contention_check, PROB_MIN, COUNT_UNKNOWN);
+ IfNode *contention_iff = new IfNode (needgc_false, contention_check, PROB_MIN, COUNT_UNKNOWN);
transform_later(contention_iff);
- Node *contention_true = new (C) IfTrueNode(contention_iff);
+ Node *contention_true = new IfTrueNode(contention_iff);
transform_later(contention_true);
// If contention, loopback and try again.
contended_region->init_req(contended_loopback_path, contention_true);
contended_phi_rawmem->init_req(contended_loopback_path, store_eden_top);
// Fast-path succeeded with no contention!
- Node *contention_false = new (C) IfFalseNode(contention_iff);
+ Node *contention_false = new IfFalseNode(contention_iff);
transform_later(contention_false);
fast_oop_ctrl = contention_false;
// Bump total allocated bytes for this thread
- Node* thread = new (C) ThreadLocalNode();
+ Node* thread = new ThreadLocalNode();
transform_later(thread);
Node* alloc_bytes_adr = basic_plus_adr(top()/*not oop*/, thread,
in_bytes(JavaThread::allocated_bytes_offset()));
@@ -1361,10 +1361,10 @@
#ifdef _LP64
Node* alloc_size = size_in_bytes;
#else
- Node* alloc_size = new (C) ConvI2LNode(size_in_bytes);
+ Node* alloc_size = new ConvI2LNode(size_in_bytes);
transform_later(alloc_size);
#endif
- Node* new_alloc_bytes = new (C) AddLNode(alloc_bytes, alloc_size);
+ Node* new_alloc_bytes = new AddLNode(alloc_bytes, alloc_size);
transform_later(new_alloc_bytes);
fast_oop_rawmem = make_store(fast_oop_ctrl, store_eden_top, alloc_bytes_adr,
0, new_alloc_bytes, T_LONG);
@@ -1391,9 +1391,9 @@
mb->init_req(TypeFunc::Memory, fast_oop_rawmem);
mb->init_req(TypeFunc::Control, fast_oop_ctrl);
- fast_oop_ctrl = new (C) ProjNode(mb,TypeFunc::Control);
+ fast_oop_ctrl = new ProjNode(mb,TypeFunc::Control);
transform_later(fast_oop_ctrl);
- fast_oop_rawmem = new (C) ProjNode(mb,TypeFunc::Memory);
+ fast_oop_rawmem = new ProjNode(mb,TypeFunc::Memory);
transform_later(fast_oop_rawmem);
} else {
// Add the MemBarStoreStore after the InitializeNode so that
@@ -1407,9 +1407,9 @@
MemBarNode* mb = MemBarNode::make(C, Op_MemBarStoreStore, Compile::AliasIdxBot);
transform_later(mb);
- Node* ctrl = new (C) ProjNode(init,TypeFunc::Control);
+ Node* ctrl = new ProjNode(init,TypeFunc::Control);
transform_later(ctrl);
- Node* mem = new (C) ProjNode(init,TypeFunc::Memory);
+ Node* mem = new ProjNode(init,TypeFunc::Memory);
transform_later(mem);
// The MemBarStoreStore depends on control and memory coming
@@ -1417,9 +1417,9 @@
mb->init_req(TypeFunc::Memory, mem);
mb->init_req(TypeFunc::Control, ctrl);
- ctrl = new (C) ProjNode(mb,TypeFunc::Control);
+ ctrl = new ProjNode(mb,TypeFunc::Control);
transform_later(ctrl);
- mem = new (C) ProjNode(mb,TypeFunc::Memory);
+ mem = new ProjNode(mb,TypeFunc::Memory);
transform_later(mem);
// All nodes that depended on the InitializeNode for control
@@ -1433,13 +1433,13 @@
if (C->env()->dtrace_extended_probes()) {
// Slow-path call
int size = TypeFunc::Parms + 2;
- CallLeafNode *call = new (C) CallLeafNode(OptoRuntime::dtrace_object_alloc_Type(),
- CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_object_alloc_base),
- "dtrace_object_alloc",
- TypeRawPtr::BOTTOM);
+ CallLeafNode *call = new CallLeafNode(OptoRuntime::dtrace_object_alloc_Type(),
+ CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_object_alloc_base),
+ "dtrace_object_alloc",
+ TypeRawPtr::BOTTOM);
// Get base of thread-local storage area
- Node* thread = new (C) ThreadLocalNode();
+ Node* thread = new ThreadLocalNode();
transform_later(thread);
call->init_req(TypeFunc::Parms+0, thread);
@@ -1450,9 +1450,9 @@
call->init_req(TypeFunc::ReturnAdr, alloc->in(TypeFunc::ReturnAdr));
call->init_req(TypeFunc::FramePtr, alloc->in(TypeFunc::FramePtr));
transform_later(call);
- fast_oop_ctrl = new (C) ProjNode(call,TypeFunc::Control);
+ fast_oop_ctrl = new ProjNode(call,TypeFunc::Control);
transform_later(fast_oop_ctrl);
- fast_oop_rawmem = new (C) ProjNode(call,TypeFunc::Memory);
+ fast_oop_rawmem = new ProjNode(call,TypeFunc::Memory);
transform_later(fast_oop_rawmem);
}
@@ -1467,7 +1467,7 @@
}
// Generate slow-path call
- CallNode *call = new (C) CallStaticJavaNode(slow_call_type, slow_call_address,
+ CallNode *call = new CallStaticJavaNode(slow_call_type, slow_call_address,
OptoRuntime::stub_name(slow_call_address),
alloc->jvms()->bci(),
TypePtr::BOTTOM);
@@ -1524,7 +1524,7 @@
// _memproj_catchall so we end up with a call that has only 1 memory projection.
if (_memproj_catchall != NULL ) {
if (_memproj_fallthrough == NULL) {
- _memproj_fallthrough = new (C) ProjNode(call, TypeFunc::Memory);
+ _memproj_fallthrough = new ProjNode(call, TypeFunc::Memory);
transform_later(_memproj_fallthrough);
}
for (DUIterator_Fast imax, i = _memproj_catchall->fast_outs(imax); i < imax; i++) {
@@ -1556,7 +1556,7 @@
// _ioproj_catchall so we end up with a call that has only 1 i_o projection.
if (_ioproj_catchall != NULL ) {
if (_ioproj_fallthrough == NULL) {
- _ioproj_fallthrough = new (C) ProjNode(call, TypeFunc::I_O);
+ _ioproj_fallthrough = new ProjNode(call, TypeFunc::I_O);
transform_later(_ioproj_fallthrough);
}
for (DUIterator_Fast imax, i = _ioproj_catchall->fast_outs(imax); i < imax; i++) {
@@ -1690,47 +1690,47 @@
// As an allocation hits the watermark, we will prefetch starting
// at a "distance" away from watermark.
- Node *pf_region = new (C) RegionNode(3);
- Node *pf_phi_rawmem = new (C) PhiNode( pf_region, Type::MEMORY,
+ Node *pf_region = new RegionNode(3);
+ Node *pf_phi_rawmem = new PhiNode( pf_region, Type::MEMORY,
TypeRawPtr::BOTTOM );
// I/O is used for Prefetch
- Node *pf_phi_abio = new (C) PhiNode( pf_region, Type::ABIO );
+ Node *pf_phi_abio = new PhiNode( pf_region, Type::ABIO );
- Node *thread = new (C) ThreadLocalNode();
+ Node *thread = new ThreadLocalNode();
transform_later(thread);
- Node *eden_pf_adr = new (C) AddPNode( top()/*not oop*/, thread,
+ Node *eden_pf_adr = new AddPNode( top()/*not oop*/, thread,
_igvn.MakeConX(in_bytes(JavaThread::tlab_pf_top_offset())) );
transform_later(eden_pf_adr);
- Node *old_pf_wm = new (C) LoadPNode(needgc_false,
+ Node *old_pf_wm = new LoadPNode(needgc_false,
contended_phi_rawmem, eden_pf_adr,
TypeRawPtr::BOTTOM, TypeRawPtr::BOTTOM,
MemNode::unordered);
transform_later(old_pf_wm);
// check against new_eden_top
- Node *need_pf_cmp = new (C) CmpPNode( new_eden_top, old_pf_wm );
+ Node *need_pf_cmp = new CmpPNode( new_eden_top, old_pf_wm );
transform_later(need_pf_cmp);
- Node *need_pf_bol = new (C) BoolNode( need_pf_cmp, BoolTest::ge );
+ Node *need_pf_bol = new BoolNode( need_pf_cmp, BoolTest::ge );
transform_later(need_pf_bol);
- IfNode *need_pf_iff = new (C) IfNode( needgc_false, need_pf_bol,
+ IfNode *need_pf_iff = new IfNode( needgc_false, need_pf_bol,
PROB_UNLIKELY_MAG(4), COUNT_UNKNOWN );
transform_later(need_pf_iff);
// true node, add prefetchdistance
- Node *need_pf_true = new (C) IfTrueNode( need_pf_iff );
+ Node *need_pf_true = new IfTrueNode( need_pf_iff );
transform_later(need_pf_true);
- Node *need_pf_false = new (C) IfFalseNode( need_pf_iff );
+ Node *need_pf_false = new IfFalseNode( need_pf_iff );
transform_later(need_pf_false);
- Node *new_pf_wmt = new (C) AddPNode( top(), old_pf_wm,
+ Node *new_pf_wmt = new AddPNode( top(), old_pf_wm,
_igvn.MakeConX(AllocatePrefetchDistance) );
transform_later(new_pf_wmt );
new_pf_wmt->set_req(0, need_pf_true);
- Node *store_new_wmt = new (C) StorePNode(need_pf_true,
+ Node *store_new_wmt = new StorePNode(need_pf_true,
contended_phi_rawmem, eden_pf_adr,
TypeRawPtr::BOTTOM, new_pf_wmt,
MemNode::unordered);
@@ -1746,10 +1746,10 @@
uint distance = 0;
for ( uint i = 0; i < lines; i++ ) {
- prefetch_adr = new (C) AddPNode( old_pf_wm, new_pf_wmt,
+ prefetch_adr = new AddPNode( old_pf_wm, new_pf_wmt,
_igvn.MakeConX(distance) );
transform_later(prefetch_adr);
- prefetch = new (C) PrefetchAllocationNode( i_o, prefetch_adr );
+ prefetch = new PrefetchAllocationNode( i_o, prefetch_adr );
transform_later(prefetch);
distance += step_size;
i_o = prefetch;
@@ -1772,8 +1772,8 @@
} else if( UseTLAB && AllocatePrefetchStyle == 3 ) {
// Insert a prefetch for each allocation.
// This code is used for Sparc with BIS.
- Node *pf_region = new (C) RegionNode(3);
- Node *pf_phi_rawmem = new (C) PhiNode( pf_region, Type::MEMORY,
+ Node *pf_region = new RegionNode(3);
+ Node *pf_phi_rawmem = new PhiNode( pf_region, Type::MEMORY,
TypeRawPtr::BOTTOM );
// Generate several prefetch instructions.
@@ -1782,29 +1782,29 @@
uint distance = AllocatePrefetchDistance;
// Next cache address.
- Node *cache_adr = new (C) AddPNode(old_eden_top, old_eden_top,
+ Node *cache_adr = new AddPNode(old_eden_top, old_eden_top,
_igvn.MakeConX(distance));
transform_later(cache_adr);
- cache_adr = new (C) CastP2XNode(needgc_false, cache_adr);
+ cache_adr = new CastP2XNode(needgc_false, cache_adr);
transform_later(cache_adr);
Node* mask = _igvn.MakeConX(~(intptr_t)(step_size-1));
- cache_adr = new (C) AndXNode(cache_adr, mask);
+ cache_adr = new AndXNode(cache_adr, mask);
transform_later(cache_adr);
- cache_adr = new (C) CastX2PNode(cache_adr);
+ cache_adr = new CastX2PNode(cache_adr);
transform_later(cache_adr);
// Prefetch
- Node *prefetch = new (C) PrefetchAllocationNode( contended_phi_rawmem, cache_adr );
+ Node *prefetch = new PrefetchAllocationNode( contended_phi_rawmem, cache_adr );
prefetch->set_req(0, needgc_false);
transform_later(prefetch);
contended_phi_rawmem = prefetch;
Node *prefetch_adr;
distance = step_size;
for ( uint i = 1; i < lines; i++ ) {
- prefetch_adr = new (C) AddPNode( cache_adr, cache_adr,
+ prefetch_adr = new AddPNode( cache_adr, cache_adr,
_igvn.MakeConX(distance) );
transform_later(prefetch_adr);
- prefetch = new (C) PrefetchAllocationNode( contended_phi_rawmem, prefetch_adr );
+ prefetch = new PrefetchAllocationNode( contended_phi_rawmem, prefetch_adr );
transform_later(prefetch);
distance += step_size;
contended_phi_rawmem = prefetch;
@@ -1818,10 +1818,10 @@
uint step_size = AllocatePrefetchStepSize;
uint distance = AllocatePrefetchDistance;
for ( uint i = 0; i < lines; i++ ) {
- prefetch_adr = new (C) AddPNode( old_eden_top, new_eden_top,
+ prefetch_adr = new AddPNode( old_eden_top, new_eden_top,
_igvn.MakeConX(distance) );
transform_later(prefetch_adr);
- prefetch = new (C) PrefetchAllocationNode( i_o, prefetch_adr );
+ prefetch = new PrefetchAllocationNode( i_o, prefetch_adr );
// Do not let it float too high, since if eden_top == eden_end,
// both might be null.
if( i == 0 ) { // Set control for first prefetch, next follows it
@@ -2170,12 +2170,12 @@
* }
*/
- region = new (C) RegionNode(5);
+ region = new RegionNode(5);
// create a Phi for the memory state
- mem_phi = new (C) PhiNode( region, Type::MEMORY, TypeRawPtr::BOTTOM);
+ mem_phi = new PhiNode( region, Type::MEMORY, TypeRawPtr::BOTTOM);
- Node* fast_lock_region = new (C) RegionNode(3);
- Node* fast_lock_mem_phi = new (C) PhiNode( fast_lock_region, Type::MEMORY, TypeRawPtr::BOTTOM);
+ Node* fast_lock_region = new RegionNode(3);
+ Node* fast_lock_mem_phi = new PhiNode( fast_lock_region, Type::MEMORY, TypeRawPtr::BOTTOM);
// First, check mark word for the biased lock pattern.
Node* mark_node = make_load(ctrl, mem, obj, oopDesc::mark_offset_in_bytes(), TypeX_X, TypeX_X->basic_type());
@@ -2205,10 +2205,10 @@
}
Node *proto_node = make_load(ctrl, mem, klass_node, in_bytes(Klass::prototype_header_offset()), TypeX_X, TypeX_X->basic_type());
- Node* thread = transform_later(new (C) ThreadLocalNode());
- Node* cast_thread = transform_later(new (C) CastP2XNode(ctrl, thread));
- Node* o_node = transform_later(new (C) OrXNode(cast_thread, proto_node));
- Node* x_node = transform_later(new (C) XorXNode(o_node, mark_node));
+ Node* thread = transform_later(new ThreadLocalNode());
+ Node* cast_thread = transform_later(new CastP2XNode(ctrl, thread));
+ Node* o_node = transform_later(new OrXNode(cast_thread, proto_node));
+ Node* x_node = transform_later(new XorXNode(o_node, mark_node));
// Get slow path - mark word does NOT match the value.
Node* not_biased_ctrl = opt_bits_test(ctrl, region, 3, x_node,
@@ -2231,17 +2231,17 @@
// We are going to try to reset the mark of this object to the prototype
// value and fall through to the CAS-based locking scheme.
Node* adr = basic_plus_adr(obj, oopDesc::mark_offset_in_bytes());
- Node* cas = new (C) StoreXConditionalNode(not_biased_ctrl, mem, adr,
- proto_node, mark_node);
+ Node* cas = new StoreXConditionalNode(not_biased_ctrl, mem, adr,
+ proto_node, mark_node);
transform_later(cas);
- Node* proj = transform_later( new (C) SCMemProjNode(cas));
+ Node* proj = transform_later(new SCMemProjNode(cas));
fast_lock_mem_phi->init_req(2, proj);
// Second, check epoch bits.
- Node* rebiased_region = new (C) RegionNode(3);
- Node* old_phi = new (C) PhiNode( rebiased_region, TypeX_X);
- Node* new_phi = new (C) PhiNode( rebiased_region, TypeX_X);
+ Node* rebiased_region = new RegionNode(3);
+ Node* old_phi = new PhiNode( rebiased_region, TypeX_X);
+ Node* new_phi = new PhiNode( rebiased_region, TypeX_X);
// Get slow path - mark word does NOT match epoch bits.
Node* epoch_ctrl = opt_bits_test(ctrl, rebiased_region, 1, x_node,
@@ -2258,9 +2258,9 @@
Node* cmask = MakeConX(markOopDesc::biased_lock_mask_in_place |
markOopDesc::age_mask_in_place |
markOopDesc::epoch_mask_in_place);
- Node* old = transform_later(new (C) AndXNode(mark_node, cmask));
- cast_thread = transform_later(new (C) CastP2XNode(ctrl, thread));
- Node* new_mark = transform_later(new (C) OrXNode(cast_thread, old));
+ Node* old = transform_later(new AndXNode(mark_node, cmask));
+ cast_thread = transform_later(new CastP2XNode(ctrl, thread));
+ Node* new_mark = transform_later(new OrXNode(cast_thread, old));
old_phi->init_req(1, old);
new_phi->init_req(1, new_mark);
@@ -2270,10 +2270,9 @@
// Try to acquire the bias of the object using an atomic operation.
// If this fails we will go in to the runtime to revoke the object's bias.
- cas = new (C) StoreXConditionalNode(rebiased_region, mem, adr,
- new_phi, old_phi);
+ cas = new StoreXConditionalNode(rebiased_region, mem, adr, new_phi, old_phi);
transform_later(cas);
- proj = transform_later( new (C) SCMemProjNode(cas));
+ proj = transform_later(new SCMemProjNode(cas));
// Get slow path - Failed to CAS.
not_biased_ctrl = opt_bits_test(rebiased_region, region, 4, cas, 0, 0);
@@ -2281,8 +2280,8 @@
// region->in(4) is set to fast path - the object is rebiased to the current thread.
// Failed to CAS.
- slow_path = new (C) RegionNode(3);
- Node *slow_mem = new (C) PhiNode( slow_path, Type::MEMORY, TypeRawPtr::BOTTOM);
+ slow_path = new RegionNode(3);
+ Node *slow_mem = new PhiNode( slow_path, Type::MEMORY, TypeRawPtr::BOTTOM);
slow_path->init_req(1, not_biased_ctrl); // Capture slow-control
slow_mem->init_req(1, proj);
@@ -2306,9 +2305,9 @@
lock->set_req(TypeFunc::Memory, slow_mem);
} else {
- region = new (C) RegionNode(3);
+ region = new RegionNode(3);
// create a Phi for the memory state
- mem_phi = new (C) PhiNode( region, Type::MEMORY, TypeRawPtr::BOTTOM);
+ mem_phi = new PhiNode( region, Type::MEMORY, TypeRawPtr::BOTTOM);
// Optimize test; set region slot 2
slow_path = opt_bits_test(ctrl, region, 2, flock, 0, 0);
@@ -2339,7 +2338,7 @@
transform_later(region);
_igvn.replace_node(_fallthroughproj, region);
- Node *memproj = transform_later( new(C) ProjNode(call, TypeFunc::Memory) );
+ Node *memproj = transform_later(new ProjNode(call, TypeFunc::Memory));
mem_phi->init_req(1, memproj );
transform_later(mem_phi);
_igvn.replace_node(_memproj_fallthrough, mem_phi);
@@ -2364,9 +2363,9 @@
if (UseOptoBiasInlining) {
// Check for biased locking unlock case, which is a no-op.
// See the full description in MacroAssembler::biased_locking_exit().
- region = new (C) RegionNode(4);
+ region = new RegionNode(4);
// create a Phi for the memory state
- mem_phi = new (C) PhiNode( region, Type::MEMORY, TypeRawPtr::BOTTOM);
+ mem_phi = new PhiNode( region, Type::MEMORY, TypeRawPtr::BOTTOM);
mem_phi->init_req(3, mem);
Node* mark_node = make_load(ctrl, mem, obj, oopDesc::mark_offset_in_bytes(), TypeX_X, TypeX_X->basic_type());
@@ -2374,12 +2373,12 @@
markOopDesc::biased_lock_mask_in_place,
markOopDesc::biased_lock_pattern);
} else {
- region = new (C) RegionNode(3);
+ region = new RegionNode(3);
// create a Phi for the memory state
- mem_phi = new (C) PhiNode( region, Type::MEMORY, TypeRawPtr::BOTTOM);
+ mem_phi = new PhiNode( region, Type::MEMORY, TypeRawPtr::BOTTOM);
}
- FastUnlockNode *funlock = new (C) FastUnlockNode( ctrl, obj, box );
+ FastUnlockNode *funlock = new FastUnlockNode( ctrl, obj, box );
funlock = transform_later( funlock )->as_FastUnlock();
// Optimize test; set region slot 2
Node *slow_path = opt_bits_test(ctrl, region, 2, funlock, 0, 0);
@@ -2404,7 +2403,7 @@
transform_later(region);
_igvn.replace_node(_fallthroughproj, region);
- Node *memproj = transform_later( new(C) ProjNode(call, TypeFunc::Memory) );
+ Node *memproj = transform_later(new ProjNode(call, TypeFunc::Memory) );
mem_phi->init_req(1, memproj );
mem_phi->init_req(2, mem);
transform_later(mem_phi);
--- a/hotspot/src/share/vm/opto/macro.hpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/macro.hpp Wed Jul 05 19:46:31 2017 +0200
@@ -52,7 +52,7 @@
return basic_plus_adr(base, base, offset);
}
Node* basic_plus_adr(Node* base, Node* ptr, Node* offset) {
- Node* adr = new (C) AddPNode(base, ptr, offset);
+ Node* adr = new AddPNode(base, ptr, offset);
return transform_later(adr);
}
Node* transform_later(Node* n) {
--- a/hotspot/src/share/vm/opto/matcher.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/matcher.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -751,7 +751,7 @@
tail_call_rms[tail_call_edge_cnt].Insert(OptoReg::Name(i+1));
tail_jump_rms[tail_jump_edge_cnt].Insert(OptoReg::Name(i+1));
halt_rms [ halt_edge_cnt].Insert(OptoReg::Name(i+1));
- mproj = new (C) MachProjNode( start, proj_cnt, ret_rms[ret_edge_cnt], Op_RegD );
+ mproj = new MachProjNode( start, proj_cnt, ret_rms[ret_edge_cnt], Op_RegD );
proj_cnt += 2; // Skip 2 for doubles
}
else if( (i&1) == 1 && // Else check for high half of double
@@ -777,7 +777,7 @@
tail_call_rms[tail_call_edge_cnt].Insert(OptoReg::Name(i+1));
tail_jump_rms[tail_jump_edge_cnt].Insert(OptoReg::Name(i+1));
halt_rms [ halt_edge_cnt].Insert(OptoReg::Name(i+1));
- mproj = new (C) MachProjNode( start, proj_cnt, ret_rms[ret_edge_cnt], Op_RegL );
+ mproj = new MachProjNode( start, proj_cnt, ret_rms[ret_edge_cnt], Op_RegL );
proj_cnt += 2; // Skip 2 for longs
}
else if( (i&1) == 1 && // Else check for high half of long
@@ -792,7 +792,7 @@
mproj = C->top();
} else {
// Make a projection for it off the Start
- mproj = new (C) MachProjNode( start, proj_cnt++, ret_rms[ret_edge_cnt], _register_save_type[i] );
+ mproj = new MachProjNode( start, proj_cnt++, ret_rms[ret_edge_cnt], _register_save_type[i] );
}
ret_edge_cnt ++;
@@ -845,13 +845,13 @@
// Compute generic short-offset Loads
#ifdef _LP64
- MachNode *spillCP = match_tree(new (C) LoadNNode(NULL,mem,fp,atp,TypeInstPtr::BOTTOM,MemNode::unordered));
+ MachNode *spillCP = match_tree(new LoadNNode(NULL,mem,fp,atp,TypeInstPtr::BOTTOM,MemNode::unordered));
#endif
- MachNode *spillI = match_tree(new (C) LoadINode(NULL,mem,fp,atp,TypeInt::INT,MemNode::unordered));
- MachNode *spillL = match_tree(new (C) LoadLNode(NULL,mem,fp,atp,TypeLong::LONG,MemNode::unordered,false));
- MachNode *spillF = match_tree(new (C) LoadFNode(NULL,mem,fp,atp,Type::FLOAT,MemNode::unordered));
- MachNode *spillD = match_tree(new (C) LoadDNode(NULL,mem,fp,atp,Type::DOUBLE,MemNode::unordered));
- MachNode *spillP = match_tree(new (C) LoadPNode(NULL,mem,fp,atp,TypeInstPtr::BOTTOM,MemNode::unordered));
+ MachNode *spillI = match_tree(new LoadINode(NULL,mem,fp,atp,TypeInt::INT,MemNode::unordered));
+ MachNode *spillL = match_tree(new LoadLNode(NULL,mem,fp,atp,TypeLong::LONG,MemNode::unordered,false));
+ MachNode *spillF = match_tree(new LoadFNode(NULL,mem,fp,atp,Type::FLOAT,MemNode::unordered));
+ MachNode *spillD = match_tree(new LoadDNode(NULL,mem,fp,atp,Type::DOUBLE,MemNode::unordered));
+ MachNode *spillP = match_tree(new LoadPNode(NULL,mem,fp,atp,TypeInstPtr::BOTTOM,MemNode::unordered));
assert(spillI != NULL && spillL != NULL && spillF != NULL &&
spillD != NULL && spillP != NULL, "");
// Get the ADLC notion of the right regmask, for each basic type.
@@ -867,19 +867,19 @@
// Vector regmasks.
if (Matcher::vector_size_supported(T_BYTE,4)) {
TypeVect::VECTS = TypeVect::make(T_BYTE, 4);
- MachNode *spillVectS = match_tree(new (C) LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTS));
+ MachNode *spillVectS = match_tree(new LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTS));
idealreg2regmask[Op_VecS] = &spillVectS->out_RegMask();
}
if (Matcher::vector_size_supported(T_FLOAT,2)) {
- MachNode *spillVectD = match_tree(new (C) LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTD));
+ MachNode *spillVectD = match_tree(new LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTD));
idealreg2regmask[Op_VecD] = &spillVectD->out_RegMask();
}
if (Matcher::vector_size_supported(T_FLOAT,4)) {
- MachNode *spillVectX = match_tree(new (C) LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTX));
+ MachNode *spillVectX = match_tree(new LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTX));
idealreg2regmask[Op_VecX] = &spillVectX->out_RegMask();
}
if (Matcher::vector_size_supported(T_FLOAT,8)) {
- MachNode *spillVectY = match_tree(new (C) LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTY));
+ MachNode *spillVectY = match_tree(new LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTY));
idealreg2regmask[Op_VecY] = &spillVectY->out_RegMask();
}
}
@@ -1319,7 +1319,7 @@
// is excluded on the max-per-method basis, debug info cannot land in
// this killed area.
uint r_cnt = mcall->tf()->range()->cnt();
- MachProjNode *proj = new (C) MachProjNode( mcall, r_cnt+10000, RegMask::Empty, MachProjNode::fat_proj );
+ MachProjNode *proj = new MachProjNode( mcall, r_cnt+10000, RegMask::Empty, MachProjNode::fat_proj );
if (!RegMask::can_represent_arg(OptoReg::Name(out_arg_limit_per_call-1))) {
C->record_method_not_compilable_all_tiers("unsupported outgoing calling sequence");
} else {
@@ -2274,7 +2274,7 @@
case Op_CompareAndSwapN: { // Convert trinary to binary-tree
Node *newval = n->in(MemNode::ValueIn );
Node *oldval = n->in(LoadStoreConditionalNode::ExpectedIn);
- Node *pair = new (C) BinaryNode( oldval, newval );
+ Node *pair = new BinaryNode( oldval, newval );
n->set_req(MemNode::ValueIn,pair);
n->del_req(LoadStoreConditionalNode::ExpectedIn);
break;
@@ -2289,22 +2289,22 @@
// we could move this code up next to the graph reshaping for IfNodes
// or vice-versa, but I do not want to debug this for Ladybird.
// 10/2/2000 CNC.
- Node *pair1 = new (C) BinaryNode(n->in(1),n->in(1)->in(1));
+ Node *pair1 = new BinaryNode(n->in(1),n->in(1)->in(1));
n->set_req(1,pair1);
- Node *pair2 = new (C) BinaryNode(n->in(2),n->in(3));
+ Node *pair2 = new BinaryNode(n->in(2),n->in(3));
n->set_req(2,pair2);
n->del_req(3);
break;
}
case Op_LoopLimit: {
- Node *pair1 = new (C) BinaryNode(n->in(1),n->in(2));
+ Node *pair1 = new BinaryNode(n->in(1),n->in(2));
n->set_req(1,pair1);
n->set_req(2,n->in(3));
n->del_req(3);
break;
}
case Op_StrEquals: {
- Node *pair1 = new (C) BinaryNode(n->in(2),n->in(3));
+ Node *pair1 = new BinaryNode(n->in(2),n->in(3));
n->set_req(2,pair1);
n->set_req(3,n->in(4));
n->del_req(4);
@@ -2312,9 +2312,9 @@
}
case Op_StrComp:
case Op_StrIndexOf: {
- Node *pair1 = new (C) BinaryNode(n->in(2),n->in(3));
+ Node *pair1 = new BinaryNode(n->in(2),n->in(3));
n->set_req(2,pair1);
- Node *pair2 = new (C) BinaryNode(n->in(4),n->in(5));
+ Node *pair2 = new BinaryNode(n->in(4),n->in(5));
n->set_req(3,pair2);
n->del_req(5);
n->del_req(4);
@@ -2322,7 +2322,7 @@
}
case Op_EncodeISOArray: {
// Restructure into a binary tree for Matching.
- Node* pair = new (C) BinaryNode(n->in(3), n->in(4));
+ Node* pair = new BinaryNode(n->in(3), n->in(4));
n->set_req(3, pair);
n->del_req(4);
break;
--- a/hotspot/src/share/vm/opto/memnode.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/memnode.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -908,25 +908,25 @@
rt->isa_oopptr() || is_immutable_value(adr),
"raw memory operations should have control edge");
switch (bt) {
- case T_BOOLEAN: return new (C) LoadUBNode(ctl, mem, adr, adr_type, rt->is_int(), mo);
- case T_BYTE: return new (C) LoadBNode (ctl, mem, adr, adr_type, rt->is_int(), mo);
- case T_INT: return new (C) LoadINode (ctl, mem, adr, adr_type, rt->is_int(), mo);
- case T_CHAR: return new (C) LoadUSNode(ctl, mem, adr, adr_type, rt->is_int(), mo);
- case T_SHORT: return new (C) LoadSNode (ctl, mem, adr, adr_type, rt->is_int(), mo);
- case T_LONG: return new (C) LoadLNode (ctl, mem, adr, adr_type, rt->is_long(), mo);
- case T_FLOAT: return new (C) LoadFNode (ctl, mem, adr, adr_type, rt, mo);
- case T_DOUBLE: return new (C) LoadDNode (ctl, mem, adr, adr_type, rt, mo);
- case T_ADDRESS: return new (C) LoadPNode (ctl, mem, adr, adr_type, rt->is_ptr(), mo);
+ case T_BOOLEAN: return new LoadUBNode(ctl, mem, adr, adr_type, rt->is_int(), mo);
+ case T_BYTE: return new LoadBNode (ctl, mem, adr, adr_type, rt->is_int(), mo);
+ case T_INT: return new LoadINode (ctl, mem, adr, adr_type, rt->is_int(), mo);
+ case T_CHAR: return new LoadUSNode(ctl, mem, adr, adr_type, rt->is_int(), mo);
+ case T_SHORT: return new LoadSNode (ctl, mem, adr, adr_type, rt->is_int(), mo);
+ case T_LONG: return new LoadLNode (ctl, mem, adr, adr_type, rt->is_long(), mo);
+ case T_FLOAT: return new LoadFNode (ctl, mem, adr, adr_type, rt, mo);
+ case T_DOUBLE: return new LoadDNode (ctl, mem, adr, adr_type, rt, mo);
+ case T_ADDRESS: return new LoadPNode (ctl, mem, adr, adr_type, rt->is_ptr(), mo);
case T_OBJECT:
#ifdef _LP64
if (adr->bottom_type()->is_ptr_to_narrowoop()) {
- Node* load = gvn.transform(new (C) LoadNNode(ctl, mem, adr, adr_type, rt->make_narrowoop(), mo));
- return new (C) DecodeNNode(load, load->bottom_type()->make_ptr());
+ Node* load = gvn.transform(new LoadNNode(ctl, mem, adr, adr_type, rt->make_narrowoop(), mo));
+ return new DecodeNNode(load, load->bottom_type()->make_ptr());
} else
#endif
{
assert(!adr->bottom_type()->is_ptr_to_narrowoop() && !adr->bottom_type()->is_ptr_to_narrowklass(), "should have got back a narrow oop");
- return new (C) LoadPNode(ctl, mem, adr, adr_type, rt->is_oopptr(), mo);
+ return new LoadPNode(ctl, mem, adr, adr_type, rt->is_oopptr(), mo);
}
}
ShouldNotReachHere();
@@ -935,12 +935,12 @@
LoadLNode* LoadLNode::make_atomic(Compile *C, Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, const Type* rt, MemOrd mo) {
bool require_atomic = true;
- return new (C) LoadLNode(ctl, mem, adr, adr_type, rt->is_long(), mo, require_atomic);
+ return new LoadLNode(ctl, mem, adr, adr_type, rt->is_long(), mo, require_atomic);
}
LoadDNode* LoadDNode::make_atomic(Compile *C, Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, const Type* rt, MemOrd mo) {
bool require_atomic = true;
- return new (C) LoadDNode(ctl, mem, adr, adr_type, rt, mo, require_atomic);
+ return new LoadDNode(ctl, mem, adr, adr_type, rt, mo, require_atomic);
}
@@ -1228,33 +1228,33 @@
// Add up all the offsets making of the address of the load
Node* result = elements[0];
for (int i = 1; i < count; i++) {
- result = phase->transform(new (phase->C) AddXNode(result, elements[i]));
+ result = phase->transform(new AddXNode(result, elements[i]));
}
// Remove the constant offset from the address and then
- result = phase->transform(new (phase->C) AddXNode(result, phase->MakeConX(-(int)offset)));
+ result = phase->transform(new AddXNode(result, phase->MakeConX(-(int)offset)));
// remove the scaling of the offset to recover the original index.
if (result->Opcode() == Op_LShiftX && result->in(2) == phase->intcon(shift)) {
// Peel the shift off directly but wrap it in a dummy node
// since Ideal can't return existing nodes
- result = new (phase->C) RShiftXNode(result->in(1), phase->intcon(0));
+ result = new RShiftXNode(result->in(1), phase->intcon(0));
} else if (result->is_Add() && result->in(2)->is_Con() &&
result->in(1)->Opcode() == Op_LShiftX &&
result->in(1)->in(2) == phase->intcon(shift)) {
// We can't do general optimization: ((X<<Z) + Y) >> Z ==> X + (Y>>Z)
// but for boxing cache access we know that X<<Z will not overflow
// (there is range check) so we do this optimizatrion by hand here.
- Node* add_con = new (phase->C) RShiftXNode(result->in(2), phase->intcon(shift));
- result = new (phase->C) AddXNode(result->in(1)->in(1), phase->transform(add_con));
+ Node* add_con = new RShiftXNode(result->in(2), phase->intcon(shift));
+ result = new AddXNode(result->in(1)->in(1), phase->transform(add_con));
} else {
- result = new (phase->C) RShiftXNode(result, phase->intcon(shift));
+ result = new RShiftXNode(result, phase->intcon(shift));
}
#ifdef _LP64
if (bt != T_LONG) {
- result = new (phase->C) ConvL2INode(phase->transform(result));
+ result = new ConvL2INode(phase->transform(result));
}
#else
if (bt == T_LONG) {
- result = new (phase->C) ConvI2LNode(phase->transform(result));
+ result = new ConvI2LNode(phase->transform(result));
}
#endif
return result;
@@ -1385,7 +1385,7 @@
this_iid = base->_idx;
}
PhaseIterGVN* igvn = phase->is_IterGVN();
- Node* phi = new (C) PhiNode(region, this_type, NULL, this_iid, this_index, this_offset);
+ Node* phi = new PhiNode(region, this_type, NULL, this_iid, this_index, this_offset);
for (uint i = 1; i < region->req(); i++) {
Node* x;
Node* the_clone = NULL;
@@ -1408,7 +1408,7 @@
}
if (base_is_phi && (base->in(0) == region)) {
Node* base_x = base->in(i); // Clone address for loads from boxed objects.
- Node* adr_x = phase->transform(new (C) AddPNode(base_x,base_x,address->in(AddPNode::Offset)));
+ Node* adr_x = phase->transform(new AddPNode(base_x,base_x,address->in(AddPNode::Offset)));
x->set_req(Address, adr_x);
}
}
@@ -1897,8 +1897,8 @@
Node* mem = in(MemNode::Memory);
Node* value = can_see_stored_value(mem,phase);
if( value && !phase->type(value)->higher_equal( _type ) ) {
- Node *result = phase->transform( new (phase->C) LShiftINode(value, phase->intcon(24)) );
- return new (phase->C) RShiftINode(result, phase->intcon(24));
+ Node *result = phase->transform( new LShiftINode(value, phase->intcon(24)) );
+ return new RShiftINode(result, phase->intcon(24));
}
// Identity call will handle the case where truncation is not needed.
return LoadNode::Ideal(phase, can_reshape);
@@ -1929,7 +1929,7 @@
Node* mem = in(MemNode::Memory);
Node* value = can_see_stored_value(mem, phase);
if (value && !phase->type(value)->higher_equal(_type))
- return new (phase->C) AndINode(value, phase->intcon(0xFF));
+ return new AndINode(value, phase->intcon(0xFF));
// Identity call will handle the case where truncation is not needed.
return LoadNode::Ideal(phase, can_reshape);
}
@@ -1959,7 +1959,7 @@
Node* mem = in(MemNode::Memory);
Node* value = can_see_stored_value(mem,phase);
if( value && !phase->type(value)->higher_equal( _type ) )
- return new (phase->C) AndINode(value,phase->intcon(0xFFFF));
+ return new AndINode(value,phase->intcon(0xFFFF));
// Identity call will handle the case where truncation is not needed.
return LoadNode::Ideal(phase, can_reshape);
}
@@ -1989,8 +1989,8 @@
Node* mem = in(MemNode::Memory);
Node* value = can_see_stored_value(mem,phase);
if( value && !phase->type(value)->higher_equal( _type ) ) {
- Node *result = phase->transform( new (phase->C) LShiftINode(value, phase->intcon(16)) );
- return new (phase->C) RShiftINode(result, phase->intcon(16));
+ Node *result = phase->transform( new LShiftINode(value, phase->intcon(16)) );
+ return new RShiftINode(result, phase->intcon(16));
}
// Identity call will handle the case where truncation is not needed.
return LoadNode::Ideal(phase, can_reshape);
@@ -2022,12 +2022,12 @@
#ifdef _LP64
if (adr_type->is_ptr_to_narrowklass()) {
assert(UseCompressedClassPointers, "no compressed klasses");
- Node* load_klass = gvn.transform(new (C) LoadNKlassNode(ctl, mem, adr, at, tk->make_narrowklass(), MemNode::unordered));
- return new (C) DecodeNKlassNode(load_klass, load_klass->bottom_type()->make_ptr());
+ Node* load_klass = gvn.transform(new LoadNKlassNode(ctl, mem, adr, at, tk->make_narrowklass(), MemNode::unordered));
+ return new DecodeNKlassNode(load_klass, load_klass->bottom_type()->make_ptr());
}
#endif
assert(!adr_type->is_ptr_to_narrowklass() && !adr_type->is_ptr_to_narrowoop(), "should have got back a narrow oop");
- return new (C) LoadKlassNode(ctl, mem, adr, at, tk, MemNode::unordered);
+ return new LoadKlassNode(ctl, mem, adr, at, tk, MemNode::unordered);
}
//------------------------------Value------------------------------------------
@@ -2255,7 +2255,7 @@
if( t->isa_narrowklass()) return x;
assert (!t->isa_narrowoop(), "no narrow oop here");
- return phase->transform(new (phase->C) EncodePKlassNode(x, t->make_narrowklass()));
+ return phase->transform(new EncodePKlassNode(x, t->make_narrowklass()));
}
//------------------------------Value-----------------------------------------
@@ -2350,29 +2350,29 @@
switch (bt) {
case T_BOOLEAN:
- case T_BYTE: return new (C) StoreBNode(ctl, mem, adr, adr_type, val, mo);
- case T_INT: return new (C) StoreINode(ctl, mem, adr, adr_type, val, mo);
+ case T_BYTE: return new StoreBNode(ctl, mem, adr, adr_type, val, mo);
+ case T_INT: return new StoreINode(ctl, mem, adr, adr_type, val, mo);
case T_CHAR:
- case T_SHORT: return new (C) StoreCNode(ctl, mem, adr, adr_type, val, mo);
- case T_LONG: return new (C) StoreLNode(ctl, mem, adr, adr_type, val, mo);
- case T_FLOAT: return new (C) StoreFNode(ctl, mem, adr, adr_type, val, mo);
- case T_DOUBLE: return new (C) StoreDNode(ctl, mem, adr, adr_type, val, mo);
+ case T_SHORT: return new StoreCNode(ctl, mem, adr, adr_type, val, mo);
+ case T_LONG: return new StoreLNode(ctl, mem, adr, adr_type, val, mo);
+ case T_FLOAT: return new StoreFNode(ctl, mem, adr, adr_type, val, mo);
+ case T_DOUBLE: return new StoreDNode(ctl, mem, adr, adr_type, val, mo);
case T_METADATA:
case T_ADDRESS:
case T_OBJECT:
#ifdef _LP64
if (adr->bottom_type()->is_ptr_to_narrowoop()) {
- val = gvn.transform(new (C) EncodePNode(val, val->bottom_type()->make_narrowoop()));
- return new (C) StoreNNode(ctl, mem, adr, adr_type, val, mo);
+ val = gvn.transform(new EncodePNode(val, val->bottom_type()->make_narrowoop()));
+ return new StoreNNode(ctl, mem, adr, adr_type, val, mo);
} else if (adr->bottom_type()->is_ptr_to_narrowklass() ||
(UseCompressedClassPointers && val->bottom_type()->isa_klassptr() &&
adr->bottom_type()->isa_rawptr())) {
- val = gvn.transform(new (C) EncodePKlassNode(val, val->bottom_type()->make_narrowklass()));
- return new (C) StoreNKlassNode(ctl, mem, adr, adr_type, val, mo);
+ val = gvn.transform(new EncodePKlassNode(val, val->bottom_type()->make_narrowklass()));
+ return new StoreNKlassNode(ctl, mem, adr, adr_type, val, mo);
}
#endif
{
- return new (C) StorePNode(ctl, mem, adr, adr_type, val, mo);
+ return new StorePNode(ctl, mem, adr, adr_type, val, mo);
}
}
ShouldNotReachHere();
@@ -2381,12 +2381,12 @@
StoreLNode* StoreLNode::make_atomic(Compile *C, Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, Node* val, MemOrd mo) {
bool require_atomic = true;
- return new (C) StoreLNode(ctl, mem, adr, adr_type, val, mo, require_atomic);
+ return new StoreLNode(ctl, mem, adr, adr_type, val, mo, require_atomic);
}
StoreDNode* StoreDNode::make_atomic(Compile *C, Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, Node* val, MemOrd mo) {
bool require_atomic = true;
- return new (C) StoreDNode(ctl, mem, adr, adr_type, val, mo, require_atomic);
+ return new StoreDNode(ctl, mem, adr, adr_type, val, mo, require_atomic);
}
@@ -2779,12 +2779,12 @@
Node *zero = phase->makecon(TypeLong::ZERO);
Node *off = phase->MakeConX(BytesPerLong);
- mem = new (phase->C) StoreLNode(in(0),mem,adr,atp,zero,MemNode::unordered,false);
+ mem = new StoreLNode(in(0),mem,adr,atp,zero,MemNode::unordered,false);
count--;
while( count-- ) {
mem = phase->transform(mem);
- adr = phase->transform(new (phase->C) AddPNode(base,adr,off));
- mem = new (phase->C) StoreLNode(in(0),mem,adr,atp,zero,MemNode::unordered,false);
+ adr = phase->transform(new AddPNode(base,adr,off));
+ mem = new StoreLNode(in(0),mem,adr,atp,zero,MemNode::unordered,false);
}
return mem;
}
@@ -2825,7 +2825,7 @@
int unit = BytesPerLong;
if ((offset % unit) != 0) {
- Node* adr = new (C) AddPNode(dest, dest, phase->MakeConX(offset));
+ Node* adr = new AddPNode(dest, dest, phase->MakeConX(offset));
adr = phase->transform(adr);
const TypePtr* atp = TypeRawPtr::BOTTOM;
mem = StoreNode::make(*phase, ctl, mem, adr, atp, phase->zerocon(T_INT), T_INT, MemNode::unordered);
@@ -2855,14 +2855,14 @@
// Scale to the unit required by the CPU:
if (!Matcher::init_array_count_is_in_bytes) {
Node* shift = phase->intcon(exact_log2(unit));
- zbase = phase->transform( new(C) URShiftXNode(zbase, shift) );
- zend = phase->transform( new(C) URShiftXNode(zend, shift) );
+ zbase = phase->transform(new URShiftXNode(zbase, shift) );
+ zend = phase->transform(new URShiftXNode(zend, shift) );
}
// Bulk clear double-words
- Node* zsize = phase->transform( new(C) SubXNode(zend, zbase) );
- Node* adr = phase->transform( new(C) AddPNode(dest, dest, start_offset) );
- mem = new (C) ClearArrayNode(ctl, mem, zsize, adr);
+ Node* zsize = phase->transform(new SubXNode(zend, zbase) );
+ Node* adr = phase->transform(new AddPNode(dest, dest, start_offset) );
+ mem = new ClearArrayNode(ctl, mem, zsize, adr);
return phase->transform(mem);
}
@@ -2886,7 +2886,7 @@
start_offset, phase->MakeConX(done_offset), phase);
}
if (done_offset < end_offset) { // emit the final 32-bit store
- Node* adr = new (C) AddPNode(dest, dest, phase->MakeConX(done_offset));
+ Node* adr = new AddPNode(dest, dest, phase->MakeConX(done_offset));
adr = phase->transform(adr);
const TypePtr* atp = TypeRawPtr::BOTTOM;
mem = StoreNode::make(*phase, ctl, mem, adr, atp, phase->zerocon(T_INT), T_INT, MemNode::unordered);
@@ -2920,16 +2920,16 @@
//------------------------------make-------------------------------------------
MemBarNode* MemBarNode::make(Compile* C, int opcode, int atp, Node* pn) {
switch (opcode) {
- case Op_MemBarAcquire: return new(C) MemBarAcquireNode(C, atp, pn);
- case Op_LoadFence: return new(C) LoadFenceNode(C, atp, pn);
- case Op_MemBarRelease: return new(C) MemBarReleaseNode(C, atp, pn);
- case Op_StoreFence: return new(C) StoreFenceNode(C, atp, pn);
- case Op_MemBarAcquireLock: return new(C) MemBarAcquireLockNode(C, atp, pn);
- case Op_MemBarReleaseLock: return new(C) MemBarReleaseLockNode(C, atp, pn);
- case Op_MemBarVolatile: return new(C) MemBarVolatileNode(C, atp, pn);
- case Op_MemBarCPUOrder: return new(C) MemBarCPUOrderNode(C, atp, pn);
- case Op_Initialize: return new(C) InitializeNode(C, atp, pn);
- case Op_MemBarStoreStore: return new(C) MemBarStoreStoreNode(C, atp, pn);
+ case Op_MemBarAcquire: return new MemBarAcquireNode(C, atp, pn);
+ case Op_LoadFence: return new LoadFenceNode(C, atp, pn);
+ case Op_MemBarRelease: return new MemBarReleaseNode(C, atp, pn);
+ case Op_StoreFence: return new StoreFenceNode(C, atp, pn);
+ case Op_MemBarAcquireLock: return new MemBarAcquireLockNode(C, atp, pn);
+ case Op_MemBarReleaseLock: return new MemBarReleaseLockNode(C, atp, pn);
+ case Op_MemBarVolatile: return new MemBarVolatileNode(C, atp, pn);
+ case Op_MemBarCPUOrder: return new MemBarCPUOrderNode(C, atp, pn);
+ case Op_Initialize: return new InitializeNode(C, atp, pn);
+ case Op_MemBarStoreStore: return new MemBarStoreStoreNode(C, atp, pn);
default: ShouldNotReachHere(); return NULL;
}
}
@@ -2992,7 +2992,7 @@
igvn->replace_node(proj_out(TypeFunc::Control), in(TypeFunc::Control));
// Must return either the original node (now dead) or a new node
// (Do not return a top here, since that would break the uniqueness of top.)
- return new (phase->C) ConINode(TypeInt::ZERO);
+ return new ConINode(TypeInt::ZERO);
}
}
return NULL;
@@ -3012,7 +3012,7 @@
switch (proj->_con) {
case TypeFunc::Control:
case TypeFunc::Memory:
- return new (m->C) MachProjNode(this,proj->_con,RegMask::Empty,MachProjNode::unmatched_proj);
+ return new MachProjNode(this,proj->_con,RegMask::Empty,MachProjNode::unmatched_proj);
}
ShouldNotReachHere();
return NULL;
@@ -3438,7 +3438,7 @@
Node* addr = in(RawAddress);
if (offset != 0) {
Compile* C = phase->C;
- addr = phase->transform( new (C) AddPNode(C->top(), addr,
+ addr = phase->transform( new AddPNode(C->top(), addr,
phase->MakeConX(offset)) );
}
return addr;
@@ -4127,7 +4127,7 @@
// Make a new, untransformed MergeMem with the same base as 'mem'.
// If mem is itself a MergeMem, populate the result with the same edges.
MergeMemNode* MergeMemNode::make(Compile* C, Node* mem) {
- return new(C) MergeMemNode(mem);
+ return new MergeMemNode(mem);
}
//------------------------------cmp--------------------------------------------
--- a/hotspot/src/share/vm/opto/movenode.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/movenode.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -160,13 +160,13 @@
// from the inputs we do not need to specify it here.
CMoveNode *CMoveNode::make( Compile *C, Node *c, Node *bol, Node *left, Node *right, const Type *t ) {
switch( t->basic_type() ) {
- case T_INT: return new (C) CMoveINode( bol, left, right, t->is_int() );
- case T_FLOAT: return new (C) CMoveFNode( bol, left, right, t );
- case T_DOUBLE: return new (C) CMoveDNode( bol, left, right, t );
- case T_LONG: return new (C) CMoveLNode( bol, left, right, t->is_long() );
- case T_OBJECT: return new (C) CMovePNode( c, bol, left, right, t->is_oopptr() );
- case T_ADDRESS: return new (C) CMovePNode( c, bol, left, right, t->is_ptr() );
- case T_NARROWOOP: return new (C) CMoveNNode( c, bol, left, right, t );
+ case T_INT: return new CMoveINode( bol, left, right, t->is_int() );
+ case T_FLOAT: return new CMoveFNode( bol, left, right, t );
+ case T_DOUBLE: return new CMoveDNode( bol, left, right, t );
+ case T_LONG: return new CMoveLNode( bol, left, right, t->is_long() );
+ case T_OBJECT: return new CMovePNode( c, bol, left, right, t->is_oopptr() );
+ case T_ADDRESS: return new CMovePNode( c, bol, left, right, t->is_ptr() );
+ case T_NARROWOOP: return new CMoveNNode( c, bol, left, right, t );
default:
ShouldNotReachHere();
return NULL;
@@ -233,9 +233,9 @@
#ifndef PRODUCT
if( PrintOpto ) tty->print_cr("CMOV to I2B");
#endif
- Node *n = new (phase->C) Conv2BNode( cmp->in(1) );
+ Node *n = new Conv2BNode( cmp->in(1) );
if( flip )
- n = new (phase->C) XorINode( phase->transform(n), phase->intcon(1) );
+ n = new XorINode( phase->transform(n), phase->intcon(1) );
return n;
}
@@ -289,9 +289,9 @@
sub->in(2) != X ||
phase->type(sub->in(1)) != TypeF::ZERO ) return NULL;
- Node *abs = new (phase->C) AbsFNode( X );
+ Node *abs = new AbsFNode( X );
if( flip )
- abs = new (phase->C) SubFNode(sub->in(1), phase->transform(abs));
+ abs = new SubFNode(sub->in(1), phase->transform(abs));
return abs;
}
@@ -345,9 +345,9 @@
sub->in(2) != X ||
phase->type(sub->in(1)) != TypeD::ZERO ) return NULL;
- Node *abs = new (phase->C) AbsDNode( X );
+ Node *abs = new AbsDNode( X );
if( flip )
- abs = new (phase->C) SubDNode(sub->in(1), phase->transform(abs));
+ abs = new SubDNode(sub->in(1), phase->transform(abs));
return abs;
}
--- a/hotspot/src/share/vm/opto/mulnode.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/mulnode.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -199,22 +199,22 @@
Node *res = NULL;
jint bit1 = con & -con; // Extract low bit
if( bit1 == con ) { // Found a power of 2?
- res = new (phase->C) LShiftINode( in(1), phase->intcon(log2_intptr(bit1)) );
+ res = new LShiftINode( in(1), phase->intcon(log2_intptr(bit1)) );
} else {
// Check for constant with 2 bits set
jint bit2 = con-bit1;
bit2 = bit2 & -bit2; // Extract 2nd bit
if( bit2 + bit1 == con ) { // Found all bits in con?
- Node *n1 = phase->transform( new (phase->C) LShiftINode( in(1), phase->intcon(log2_intptr(bit1)) ) );
- Node *n2 = phase->transform( new (phase->C) LShiftINode( in(1), phase->intcon(log2_intptr(bit2)) ) );
- res = new (phase->C) AddINode( n2, n1 );
+ Node *n1 = phase->transform( new LShiftINode( in(1), phase->intcon(log2_intptr(bit1)) ) );
+ Node *n2 = phase->transform( new LShiftINode( in(1), phase->intcon(log2_intptr(bit2)) ) );
+ res = new AddINode( n2, n1 );
} else if (is_power_of_2(con+1)) {
// Sleezy: power-of-2 -1. Next time be generic.
jint temp = (jint) (con + 1);
- Node *n1 = phase->transform( new (phase->C) LShiftINode( in(1), phase->intcon(log2_intptr(temp)) ) );
- res = new (phase->C) SubINode( n1, in(1) );
+ Node *n1 = phase->transform( new LShiftINode( in(1), phase->intcon(log2_intptr(temp)) ) );
+ res = new SubINode( n1, in(1) );
} else {
return MulNode::Ideal(phase, can_reshape);
}
@@ -222,7 +222,7 @@
if( sign_flip ) { // Need to negate result?
res = phase->transform(res);// Transform, before making the zero con
- res = new (phase->C) SubINode(phase->intcon(0),res);
+ res = new SubINode(phase->intcon(0),res);
}
return res; // Return final result
@@ -295,22 +295,22 @@
Node *res = NULL;
jlong bit1 = con & -con; // Extract low bit
if( bit1 == con ) { // Found a power of 2?
- res = new (phase->C) LShiftLNode( in(1), phase->intcon(log2_long(bit1)) );
+ res = new LShiftLNode( in(1), phase->intcon(log2_long(bit1)) );
} else {
// Check for constant with 2 bits set
jlong bit2 = con-bit1;
bit2 = bit2 & -bit2; // Extract 2nd bit
if( bit2 + bit1 == con ) { // Found all bits in con?
- Node *n1 = phase->transform( new (phase->C) LShiftLNode( in(1), phase->intcon(log2_long(bit1)) ) );
- Node *n2 = phase->transform( new (phase->C) LShiftLNode( in(1), phase->intcon(log2_long(bit2)) ) );
- res = new (phase->C) AddLNode( n2, n1 );
+ Node *n1 = phase->transform( new LShiftLNode( in(1), phase->intcon(log2_long(bit1)) ) );
+ Node *n2 = phase->transform( new LShiftLNode( in(1), phase->intcon(log2_long(bit2)) ) );
+ res = new AddLNode( n2, n1 );
} else if (is_power_of_2_long(con+1)) {
// Sleezy: power-of-2 -1. Next time be generic.
jlong temp = (jlong) (con + 1);
- Node *n1 = phase->transform( new (phase->C) LShiftLNode( in(1), phase->intcon(log2_long(temp)) ) );
- res = new (phase->C) SubLNode( n1, in(1) );
+ Node *n1 = phase->transform( new LShiftLNode( in(1), phase->intcon(log2_long(temp)) ) );
+ res = new SubLNode( n1, in(1) );
} else {
return MulNode::Ideal(phase, can_reshape);
}
@@ -318,7 +318,7 @@
if( sign_flip ) { // Need to negate result?
res = phase->transform(res);// Transform, before making the zero con
- res = new (phase->C) SubLNode(phase->longcon(0),res);
+ res = new SubLNode(phase->longcon(0),res);
}
return res; // Return final result
@@ -477,31 +477,31 @@
// Masking bits off of a Character? Hi bits are already zero.
if( lop == Op_LoadUS &&
(mask & 0xFFFF0000) ) // Can we make a smaller mask?
- return new (phase->C) AndINode(load,phase->intcon(mask&0xFFFF));
+ return new AndINode(load,phase->intcon(mask&0xFFFF));
// Masking bits off of a Short? Loading a Character does some masking
if (can_reshape &&
load->outcnt() == 1 && load->unique_out() == this) {
if (lop == Op_LoadS && (mask & 0xFFFF0000) == 0 ) {
- Node *ldus = new (phase->C) LoadUSNode(load->in(MemNode::Control),
- load->in(MemNode::Memory),
- load->in(MemNode::Address),
- load->adr_type(),
- TypeInt::CHAR, MemNode::unordered);
+ Node *ldus = new LoadUSNode(load->in(MemNode::Control),
+ load->in(MemNode::Memory),
+ load->in(MemNode::Address),
+ load->adr_type(),
+ TypeInt::CHAR, MemNode::unordered);
ldus = phase->transform(ldus);
- return new (phase->C) AndINode(ldus, phase->intcon(mask & 0xFFFF));
+ return new AndINode(ldus, phase->intcon(mask & 0xFFFF));
}
// Masking sign bits off of a Byte? Do an unsigned byte load plus
// an and.
if (lop == Op_LoadB && (mask & 0xFFFFFF00) == 0) {
- Node* ldub = new (phase->C) LoadUBNode(load->in(MemNode::Control),
- load->in(MemNode::Memory),
- load->in(MemNode::Address),
- load->adr_type(),
- TypeInt::UBYTE, MemNode::unordered);
+ Node* ldub = new LoadUBNode(load->in(MemNode::Control),
+ load->in(MemNode::Memory),
+ load->in(MemNode::Address),
+ load->adr_type(),
+ TypeInt::UBYTE, MemNode::unordered);
ldub = phase->transform(ldub);
- return new (phase->C) AndINode(ldub, phase->intcon(mask));
+ return new AndINode(ldub, phase->intcon(mask));
}
}
@@ -516,8 +516,8 @@
// bits survive. NO sign-extension bits survive the maskings.
if( (sign_bits_mask & mask) == 0 ) {
// Use zero-fill shift instead
- Node *zshift = phase->transform(new (phase->C) URShiftINode(load->in(1),load->in(2)));
- return new (phase->C) AndINode( zshift, in(2) );
+ Node *zshift = phase->transform(new URShiftINode(load->in(1),load->in(2)));
+ return new AndINode( zshift, in(2) );
}
}
}
@@ -527,7 +527,7 @@
// plus 1) and the mask is of the low order bit. Skip the negate.
if( lop == Op_SubI && mask == 1 && load->in(1) &&
phase->type(load->in(1)) == TypeInt::ZERO )
- return new (phase->C) AndINode( load->in(2), in(2) );
+ return new AndINode( load->in(2), in(2) );
return MulNode::Ideal(phase, can_reshape);
}
@@ -611,9 +611,9 @@
// value. This check includes UI2L masks (0x00000000FFFFFFFF) which
// would be optimized away later in Identity.
if (op == Op_ConvI2L && (mask & CONST64(0xFFFFFFFF80000000)) == 0) {
- Node* andi = new (phase->C) AndINode(in1->in(1), phase->intcon(mask));
+ Node* andi = new AndINode(in1->in(1), phase->intcon(mask));
andi = phase->transform(andi);
- return new (phase->C) ConvI2LNode(andi);
+ return new ConvI2LNode(andi);
}
// Masking off sign bits? Dont make them!
@@ -627,8 +627,8 @@
// bits survive. NO sign-extension bits survive the maskings.
if( (sign_bits_mask & mask) == 0 ) {
// Use zero-fill shift instead
- Node *zshift = phase->transform(new (phase->C) URShiftLNode(in1->in(1), in1->in(2)));
- return new (phase->C) AndLNode(zshift, in(2));
+ Node *zshift = phase->transform(new URShiftLNode(in1->in(1), in1->in(2)));
+ return new AndLNode(zshift, in(2));
}
}
}
@@ -666,9 +666,9 @@
// and 'i2b' patterns which typically fold into 'StoreC/StoreB'.
if( con < 16 ) {
// Compute X << con0
- Node *lsh = phase->transform( new (phase->C) LShiftINode( add1->in(1), in(2) ) );
+ Node *lsh = phase->transform( new LShiftINode( add1->in(1), in(2) ) );
// Compute X<<con0 + (con1<<con0)
- return new (phase->C) AddINode( lsh, phase->intcon(t12->get_con() << con));
+ return new AddINode( lsh, phase->intcon(t12->get_con() << con));
}
}
}
@@ -677,7 +677,7 @@
if( (add1_op == Op_RShiftI || add1_op == Op_URShiftI ) &&
add1->in(2) == in(2) )
// Convert to "(x & -(1<<c0))"
- return new (phase->C) AndINode(add1->in(1),phase->intcon( -(1<<con)));
+ return new AndINode(add1->in(1),phase->intcon( -(1<<con)));
// Check for "((x>>c0) & Y)<<c0" which just masks off more low bits
if( add1_op == Op_AndI ) {
@@ -686,8 +686,8 @@
if( (add2_op == Op_RShiftI || add2_op == Op_URShiftI ) &&
add2->in(2) == in(2) ) {
// Convert to "(x & (Y<<c0))"
- Node *y_sh = phase->transform( new (phase->C) LShiftINode( add1->in(2), in(2) ) );
- return new (phase->C) AndINode( add2->in(1), y_sh );
+ Node *y_sh = phase->transform( new LShiftINode( add1->in(2), in(2) ) );
+ return new AndINode( add2->in(1), y_sh );
}
}
@@ -696,7 +696,7 @@
const jint bits_mask = right_n_bits(BitsPerJavaInteger-con);
if( add1_op == Op_AndI &&
phase->type(add1->in(2)) == TypeInt::make( bits_mask ) )
- return new (phase->C) LShiftINode( add1->in(1), in(2) );
+ return new LShiftINode( add1->in(1), in(2) );
return NULL;
}
@@ -776,9 +776,9 @@
const TypeLong *t12 = phase->type(add1->in(2))->isa_long();
if( t12 && t12->is_con() ){ // Left input is an add of a con?
// Compute X << con0
- Node *lsh = phase->transform( new (phase->C) LShiftLNode( add1->in(1), in(2) ) );
+ Node *lsh = phase->transform( new LShiftLNode( add1->in(1), in(2) ) );
// Compute X<<con0 + (con1<<con0)
- return new (phase->C) AddLNode( lsh, phase->longcon(t12->get_con() << con));
+ return new AddLNode( lsh, phase->longcon(t12->get_con() << con));
}
}
@@ -786,7 +786,7 @@
if( (add1_op == Op_RShiftL || add1_op == Op_URShiftL ) &&
add1->in(2) == in(2) )
// Convert to "(x & -(1<<c0))"
- return new (phase->C) AndLNode(add1->in(1),phase->longcon( -(CONST64(1)<<con)));
+ return new AndLNode(add1->in(1),phase->longcon( -(CONST64(1)<<con)));
// Check for "((x>>c0) & Y)<<c0" which just masks off more low bits
if( add1_op == Op_AndL ) {
@@ -795,8 +795,8 @@
if( (add2_op == Op_RShiftL || add2_op == Op_URShiftL ) &&
add2->in(2) == in(2) ) {
// Convert to "(x & (Y<<c0))"
- Node *y_sh = phase->transform( new (phase->C) LShiftLNode( add1->in(2), in(2) ) );
- return new (phase->C) AndLNode( add2->in(1), y_sh );
+ Node *y_sh = phase->transform( new LShiftLNode( add1->in(2), in(2) ) );
+ return new AndLNode( add2->in(1), y_sh );
}
}
@@ -805,7 +805,7 @@
const jlong bits_mask = ((jlong)CONST64(1) << (jlong)(BitsPerJavaLong - con)) - CONST64(1);
if( add1_op == Op_AndL &&
phase->type(add1->in(2)) == TypeLong::make( bits_mask ) )
- return new (phase->C) LShiftLNode( add1->in(1), in(2) );
+ return new LShiftLNode( add1->in(1), in(2) );
return NULL;
}
@@ -907,8 +907,8 @@
Node *x = mask->in(1);
jint maskbits = t3->get_con();
// Convert to "(x >> shift) & (mask >> shift)"
- Node *shr_nomask = phase->transform( new (phase->C) RShiftINode(mask->in(1), in(2)) );
- return new (phase->C) AndINode(shr_nomask, phase->intcon( maskbits >> shift));
+ Node *shr_nomask = phase->transform( new RShiftINode(mask->in(1), in(2)) );
+ return new AndINode(shr_nomask, phase->intcon( maskbits >> shift));
}
// Check for "(short[i] <<16)>>16" which simply sign-extends
@@ -933,11 +933,11 @@
ld->Opcode() == Op_LoadUS &&
ld->outcnt() == 1 && ld->unique_out() == shl)
// Replace zero-extension-load with sign-extension-load
- return new (phase->C) LoadSNode( ld->in(MemNode::Control),
- ld->in(MemNode::Memory),
- ld->in(MemNode::Address),
- ld->adr_type(), TypeInt::SHORT,
- MemNode::unordered);
+ return new LoadSNode( ld->in(MemNode::Control),
+ ld->in(MemNode::Memory),
+ ld->in(MemNode::Address),
+ ld->adr_type(), TypeInt::SHORT,
+ MemNode::unordered);
}
// Check for "(byte[i] <<24)>>24" which simply sign-extends
@@ -1119,7 +1119,7 @@
const int con2 = t12->get_con() & 31; // Shift count is always masked
const int con3 = con+con2;
if( con3 < 32 ) // Only merge shifts if total is < 32
- return new (phase->C) URShiftINode( in(1)->in(1), phase->intcon(con3) );
+ return new URShiftINode( in(1)->in(1), phase->intcon(con3) );
}
}
@@ -1132,9 +1132,9 @@
Node *lshl = add->in(1);
if( lshl->Opcode() == Op_LShiftI &&
phase->type(lshl->in(2)) == t2 ) {
- Node *y_z = phase->transform( new (phase->C) URShiftINode(add->in(2),in(2)) );
- Node *sum = phase->transform( new (phase->C) AddINode( lshl->in(1), y_z ) );
- return new (phase->C) AndINode( sum, phase->intcon(mask) );
+ Node *y_z = phase->transform( new URShiftINode(add->in(2),in(2)) );
+ Node *sum = phase->transform( new AddINode( lshl->in(1), y_z ) );
+ return new AndINode( sum, phase->intcon(mask) );
}
}
@@ -1147,8 +1147,8 @@
if( t3 && t3->is_con() ) { // Right input is a constant
jint mask2 = t3->get_con();
mask2 >>= con; // *signed* shift downward (high-order zeroes do not help)
- Node *newshr = phase->transform( new (phase->C) URShiftINode(andi->in(1), in(2)) );
- return new (phase->C) AndINode(newshr, phase->intcon(mask2));
+ Node *newshr = phase->transform( new URShiftINode(andi->in(1), in(2)) );
+ return new AndINode(newshr, phase->intcon(mask2));
// The negative values are easier to materialize than positive ones.
// A typical case from address arithmetic is ((x & ~15) >> 4).
// It's better to change that to ((x >> 4) & ~0) versus
@@ -1160,7 +1160,7 @@
Node *shl = in(1);
if( in1_op == Op_LShiftI &&
phase->type(shl->in(2)) == t2 )
- return new (phase->C) AndINode( shl->in(1), phase->intcon(mask) );
+ return new AndINode( shl->in(1), phase->intcon(mask) );
return NULL;
}
@@ -1265,9 +1265,9 @@
Node *lshl = add->in(1);
if( lshl->Opcode() == Op_LShiftL &&
phase->type(lshl->in(2)) == t2 ) {
- Node *y_z = phase->transform( new (phase->C) URShiftLNode(add->in(2),in(2)) );
- Node *sum = phase->transform( new (phase->C) AddLNode( lshl->in(1), y_z ) );
- return new (phase->C) AndLNode( sum, phase->longcon(mask) );
+ Node *y_z = phase->transform( new URShiftLNode(add->in(2),in(2)) );
+ Node *sum = phase->transform( new AddLNode( lshl->in(1), y_z ) );
+ return new AndLNode( sum, phase->longcon(mask) );
}
}
@@ -1280,8 +1280,8 @@
if( t3 && t3->is_con() ) { // Right input is a constant
jlong mask2 = t3->get_con();
mask2 >>= con; // *signed* shift downward (high-order zeroes do not help)
- Node *newshr = phase->transform( new (phase->C) URShiftLNode(andi->in(1), in(2)) );
- return new (phase->C) AndLNode(newshr, phase->longcon(mask2));
+ Node *newshr = phase->transform( new URShiftLNode(andi->in(1), in(2)) );
+ return new AndLNode(newshr, phase->longcon(mask2));
}
}
@@ -1289,7 +1289,7 @@
Node *shl = in(1);
if( shl->Opcode() == Op_LShiftL &&
phase->type(shl->in(2)) == t2 )
- return new (phase->C) AndLNode( shl->in(1), phase->longcon(mask) );
+ return new AndLNode( shl->in(1), phase->longcon(mask) );
return NULL;
}
--- a/hotspot/src/share/vm/opto/node.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/node.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -274,23 +274,6 @@
// The value NULL is reserved for the top node only.
#define NO_OUT_ARRAY ((Node**)-1)
-// This funny expression handshakes with Node::operator new
-// to pull Compile::current out of the new node's _out field,
-// and then calls a subroutine which manages most field
-// initializations. The only one which is tricky is the
-// _idx field, which is const, and so must be initialized
-// by a return value, not an assignment.
-//
-// (Aren't you thankful that Java finals don't require so many tricks?)
-#define IDX_INIT(req) this->Init((req), (Compile*) this->_out)
-#ifdef _MSC_VER // the IDX_INIT hack falls foul of warning C4355
-#pragma warning( disable:4355 ) // 'this' : used in base member initializer list
-#endif
-#ifdef __clang__
-#pragma clang diagnostic push
-#pragma GCC diagnostic ignored "-Wuninitialized"
-#endif
-
// Out-of-line code from node constructors.
// Executed only when extra debug info. is being passed around.
static void init_node_notes(Compile* C, int idx, Node_Notes* nn) {
@@ -298,8 +281,8 @@
}
// Shared initialization code.
-inline int Node::Init(int req, Compile* C) {
- assert(Compile::current() == C, "must use operator new(Compile*)");
+inline int Node::Init(int req) {
+ Compile* C = Compile::current();
int idx = C->next_unique();
// Allocate memory for the necessary number of edges.
@@ -328,7 +311,7 @@
//------------------------------Node-------------------------------------------
// Create a Node, with a given number of required edges.
Node::Node(uint req)
- : _idx(IDX_INIT(req))
+ : _idx(Init(req))
{
assert( req < (uint)(MaxNodeLimit - NodeLimitFudgeFactor), "Input limit exceeded" );
debug_only( verify_construction() );
@@ -347,7 +330,7 @@
//------------------------------Node-------------------------------------------
Node::Node(Node *n0)
- : _idx(IDX_INIT(1))
+ : _idx(Init(1))
{
debug_only( verify_construction() );
NOT_PRODUCT(nodes_created++);
@@ -359,7 +342,7 @@
//------------------------------Node-------------------------------------------
Node::Node(Node *n0, Node *n1)
- : _idx(IDX_INIT(2))
+ : _idx(Init(2))
{
debug_only( verify_construction() );
NOT_PRODUCT(nodes_created++);
@@ -373,7 +356,7 @@
//------------------------------Node-------------------------------------------
Node::Node(Node *n0, Node *n1, Node *n2)
- : _idx(IDX_INIT(3))
+ : _idx(Init(3))
{
debug_only( verify_construction() );
NOT_PRODUCT(nodes_created++);
@@ -389,7 +372,7 @@
//------------------------------Node-------------------------------------------
Node::Node(Node *n0, Node *n1, Node *n2, Node *n3)
- : _idx(IDX_INIT(4))
+ : _idx(Init(4))
{
debug_only( verify_construction() );
NOT_PRODUCT(nodes_created++);
@@ -407,7 +390,7 @@
//------------------------------Node-------------------------------------------
Node::Node(Node *n0, Node *n1, Node *n2, Node *n3, Node *n4)
- : _idx(IDX_INIT(5))
+ : _idx(Init(5))
{
debug_only( verify_construction() );
NOT_PRODUCT(nodes_created++);
@@ -428,7 +411,7 @@
//------------------------------Node-------------------------------------------
Node::Node(Node *n0, Node *n1, Node *n2, Node *n3,
Node *n4, Node *n5)
- : _idx(IDX_INIT(6))
+ : _idx(Init(6))
{
debug_only( verify_construction() );
NOT_PRODUCT(nodes_created++);
@@ -451,7 +434,7 @@
//------------------------------Node-------------------------------------------
Node::Node(Node *n0, Node *n1, Node *n2, Node *n3,
Node *n4, Node *n5, Node *n6)
- : _idx(IDX_INIT(7))
+ : _idx(Init(7))
{
debug_only( verify_construction() );
NOT_PRODUCT(nodes_created++);
@@ -473,10 +456,6 @@
_in[6] = n6; if (n6 != NULL) n6->add_out((Node *)this);
}
-#ifdef __clang__
-#pragma clang diagnostic pop
-#endif
-
//------------------------------clone------------------------------------------
// Clone a Node.
@@ -535,6 +514,9 @@
if (n->is_Call()) {
n->as_Call()->clone_jvms(C);
}
+ if (n->is_SafePoint()) {
+ n->as_SafePoint()->clone_replaced_nodes();
+ }
return n; // Return the clone
}
@@ -630,6 +612,9 @@
if (is_expensive()) {
compile->remove_expensive_node(this);
}
+ if (is_SafePoint()) {
+ as_SafePoint()->delete_replaced_nodes();
+ }
#ifdef ASSERT
// We will not actually delete the storage, but we'll make the node unusable.
*(address*)this = badAddress; // smash the C++ vtbl, probably
@@ -1066,15 +1051,15 @@
// set_req(2, phase->intcon(7));
// return this;
// Example: reshape "X*4" into "X<<2"
-// return new (C) LShiftINode(in(1), phase->intcon(2));
+// return new LShiftINode(in(1), phase->intcon(2));
//
// You must call 'phase->transform(X)' on any new Nodes X you make, except
// for the returned root node. Example: reshape "X*31" with "(X<<5)-X".
-// Node *shift=phase->transform(new(C)LShiftINode(in(1),phase->intcon(5)));
-// return new (C) AddINode(shift, in(1));
+// Node *shift=phase->transform(new LShiftINode(in(1),phase->intcon(5)));
+// return new AddINode(shift, in(1));
//
// When making a Node for a constant use 'phase->makecon' or 'phase->intcon'.
-// These forms are faster than 'phase->transform(new (C) ConNode())' and Do
+// These forms are faster than 'phase->transform(new ConNode())' and Do
// The Right Thing with def-use info.
//
// You cannot bury the 'this' Node inside of a graph reshape. If the reshaped
--- a/hotspot/src/share/vm/opto/node.hpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/node.hpp Wed Jul 05 19:46:31 2017 +0200
@@ -208,14 +208,12 @@
// field is a local cache of a value defined in some "program fragment" for
// which these Nodes are just a part of.
- // New Operator that takes a Compile pointer, this will eventually
- // be the "new" New operator.
- inline void* operator new( size_t x, Compile* C) throw() {
+ inline void* operator new(size_t x) throw() {
+ Compile* C = Compile::current();
Node* n = (Node*)C->node_arena()->Amalloc_D(x);
#ifdef ASSERT
n->_in = (Node**)n; // magic cookie for assertion check
#endif
- n->_out = (Node**)C;
return (void*)n;
}
@@ -259,7 +257,7 @@
// Puts initial values in all Node fields except _idx.
// Returns the initial value for _idx, which cannot
// be initialized by assignment.
- inline int Init(int req, Compile* C);
+ inline int Init(int req);
//----------------- input edge handling
protected:
--- a/hotspot/src/share/vm/opto/output.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/output.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -67,7 +67,7 @@
const StartNode *start = entry->head()->as_Start();
// Replace StartNode with prolog
- MachPrologNode *prolog = new (this) MachPrologNode();
+ MachPrologNode *prolog = new MachPrologNode();
entry->map_node(prolog, 0);
_cfg->map_node_to_block(prolog, entry);
_cfg->unmap_node_from_block(start); // start is no longer in any block
@@ -77,12 +77,12 @@
if( is_osr_compilation() ) {
if( PoisonOSREntry ) {
// TODO: Should use a ShouldNotReachHereNode...
- _cfg->insert( broot, 0, new (this) MachBreakpointNode() );
+ _cfg->insert( broot, 0, new MachBreakpointNode() );
}
} else {
if( _method && !_method->flags().is_static() ) {
// Insert unvalidated entry point
- _cfg->insert( broot, 0, new (this) MachUEPNode() );
+ _cfg->insert( broot, 0, new MachUEPNode() );
}
}
@@ -98,7 +98,7 @@
) {
// checking for _method means that OptoBreakpoint does not apply to
// runtime stubs or frame converters
- _cfg->insert( entry, 1, new (this) MachBreakpointNode() );
+ _cfg->insert( entry, 1, new MachBreakpointNode() );
}
// Insert epilogs before every return
@@ -107,7 +107,7 @@
if (!block->is_connector() && block->non_connector_successor(0) == _cfg->get_root_block()) { // Found a program exit point?
Node* m = block->end();
if (m->is_Mach() && m->as_Mach()->ideal_Opcode() != Op_Halt) {
- MachEpilogNode* epilog = new (this) MachEpilogNode(m->as_Mach()->ideal_Opcode() == Op_Return);
+ MachEpilogNode* epilog = new MachEpilogNode(m->as_Mach()->ideal_Opcode() == Op_Return);
block->add_inst(epilog);
_cfg->map_node_to_block(epilog, block);
}
@@ -268,7 +268,7 @@
Node* Compile::call_zap_node(MachSafePointNode* node_to_check, int block_no) {
const TypeFunc *tf = OptoRuntime::zap_dead_locals_Type();
CallStaticJavaNode* ideal_node =
- new (this) CallStaticJavaNode( tf,
+ new CallStaticJavaNode( tf,
OptoRuntime::zap_dead_locals_stub(_method->flags().is_native()),
"call zap dead locals stub", 0, TypePtr::BOTTOM);
// We need to copy the OopMap from the site we're zapping at.
@@ -368,7 +368,7 @@
// Step one, perform a pessimistic sizing pass.
uint last_call_adr = max_juint;
uint last_avoid_back_to_back_adr = max_juint;
- uint nop_size = (new (this) MachNopNode())->size(_regalloc);
+ uint nop_size = (new MachNopNode())->size(_regalloc);
for (uint i = 0; i < nblocks; i++) { // For all blocks
Block* block = _cfg->get_block(i);
@@ -1201,7 +1201,7 @@
uint *call_returns = NEW_RESOURCE_ARRAY(uint, nblocks+1);
uint return_offset = 0;
- int nop_size = (new (this) MachNopNode())->size(_regalloc);
+ int nop_size = (new MachNopNode())->size(_regalloc);
int previous_offset = 0;
int current_offset = 0;
@@ -1327,7 +1327,7 @@
if(padding > 0) {
assert((padding % nop_size) == 0, "padding is not a multiple of NOP size");
int nops_cnt = padding / nop_size;
- MachNode *nop = new (this) MachNopNode(nops_cnt);
+ MachNode *nop = new MachNopNode(nops_cnt);
block->insert_node(nop, j++);
last_inst++;
_cfg->map_node_to_block(nop, block);
@@ -1413,7 +1413,7 @@
assert((br_size - new_size) >= (int)nop_size, "short_branch size should be smaller");
// Insert padding between avoid_back_to_back branches.
if (needs_padding && replacement->avoid_back_to_back(MachNode::AVOID_BEFORE)) {
- MachNode *nop = new (this) MachNopNode();
+ MachNode *nop = new MachNopNode();
block->insert_node(nop, j++);
_cfg->map_node_to_block(nop, block);
last_inst++;
@@ -1573,7 +1573,7 @@
Block *nb = _cfg->get_block(i + 1);
int padding = nb->alignment_padding(current_offset);
if( padding > 0 ) {
- MachNode *nop = new (this) MachNopNode(padding / nop_size);
+ MachNode *nop = new MachNopNode(padding / nop_size);
block->insert_node(nop, block->number_of_nodes());
_cfg->map_node_to_block(nop, block);
nop->emit(*cb, _regalloc);
@@ -1786,7 +1786,7 @@
#endif
{
// Create a MachNopNode
- _nop = new (&compile) MachNopNode();
+ _nop = new MachNopNode();
// Now that the nops are in the array, save the count
// (but allow entries for the nops)
@@ -2688,7 +2688,7 @@
if ( _pinch_free_list.size() > 0) {
pinch = _pinch_free_list.pop();
} else {
- pinch = new (_cfg->C) Node(1); // Pinch point to-be
+ pinch = new Node(1); // Pinch point to-be
}
if (pinch->_idx >= _regalloc->node_regs_max_index()) {
_cfg->C->record_method_not_compilable("too many D-U pinch points");
--- a/hotspot/src/share/vm/opto/parse.hpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/parse.hpp Wed Jul 05 19:46:31 2017 +0200
@@ -359,12 +359,13 @@
int _est_switch_depth; // Debugging SwitchRanges.
#endif
- // parser for the caller of the method of this object
- Parse* const _parent;
+ bool _first_return; // true if return is the first to be parsed
+ bool _replaced_nodes_for_exceptions; // needs processing of replaced nodes in exception paths?
+ uint _new_idx; // any node with _idx above were new during this parsing. Used to trim the replaced nodes list.
public:
// Constructor
- Parse(JVMState* caller, ciMethod* parse_method, float expected_uses, Parse* parent);
+ Parse(JVMState* caller, ciMethod* parse_method, float expected_uses);
virtual Parse* is_Parse() const { return (Parse*)this; }
@@ -425,8 +426,6 @@
return block()->successor_for_bci(bci);
}
- Parse* parent_parser() const { return _parent; }
-
private:
// Create a JVMS & map for the initial state of this method.
SafePointNode* create_entry_map();
--- a/hotspot/src/share/vm/opto/parse1.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/parse1.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -109,10 +109,10 @@
// doubles on Sparc. Intel can handle them just fine directly.
Node *l;
switch (bt) { // Signature is flattened
- case T_INT: l = new (C) LoadINode(ctl, mem, adr, TypeRawPtr::BOTTOM, TypeInt::INT, MemNode::unordered); break;
- case T_FLOAT: l = new (C) LoadFNode(ctl, mem, adr, TypeRawPtr::BOTTOM, Type::FLOAT, MemNode::unordered); break;
- case T_ADDRESS: l = new (C) LoadPNode(ctl, mem, adr, TypeRawPtr::BOTTOM, TypeRawPtr::BOTTOM, MemNode::unordered); break;
- case T_OBJECT: l = new (C) LoadPNode(ctl, mem, adr, TypeRawPtr::BOTTOM, TypeInstPtr::BOTTOM, MemNode::unordered); break;
+ case T_INT: l = new LoadINode(ctl, mem, adr, TypeRawPtr::BOTTOM, TypeInt::INT, MemNode::unordered); break;
+ case T_FLOAT: l = new LoadFNode(ctl, mem, adr, TypeRawPtr::BOTTOM, Type::FLOAT, MemNode::unordered); break;
+ case T_ADDRESS: l = new LoadPNode(ctl, mem, adr, TypeRawPtr::BOTTOM, TypeRawPtr::BOTTOM, MemNode::unordered); break;
+ case T_OBJECT: l = new LoadPNode(ctl, mem, adr, TypeRawPtr::BOTTOM, TypeInstPtr::BOTTOM, MemNode::unordered); break;
case T_LONG:
case T_DOUBLE: {
// Since arguments are in reverse order, the argument address 'adr'
@@ -120,12 +120,12 @@
adr = basic_plus_adr(local_addrs_base, local_addrs, -(index+1)*wordSize);
if (Matcher::misaligned_doubles_ok) {
l = (bt == T_DOUBLE)
- ? (Node*)new (C) LoadDNode(ctl, mem, adr, TypeRawPtr::BOTTOM, Type::DOUBLE, MemNode::unordered)
- : (Node*)new (C) LoadLNode(ctl, mem, adr, TypeRawPtr::BOTTOM, TypeLong::LONG, MemNode::unordered);
+ ? (Node*)new LoadDNode(ctl, mem, adr, TypeRawPtr::BOTTOM, Type::DOUBLE, MemNode::unordered)
+ : (Node*)new LoadLNode(ctl, mem, adr, TypeRawPtr::BOTTOM, TypeLong::LONG, MemNode::unordered);
} else {
l = (bt == T_DOUBLE)
- ? (Node*)new (C) LoadD_unalignedNode(ctl, mem, adr, TypeRawPtr::BOTTOM, MemNode::unordered)
- : (Node*)new (C) LoadL_unalignedNode(ctl, mem, adr, TypeRawPtr::BOTTOM, MemNode::unordered);
+ ? (Node*)new LoadD_unalignedNode(ctl, mem, adr, TypeRawPtr::BOTTOM, MemNode::unordered)
+ : (Node*)new LoadL_unalignedNode(ctl, mem, adr, TypeRawPtr::BOTTOM, MemNode::unordered);
}
break;
}
@@ -149,11 +149,11 @@
if (type == TypePtr::NULL_PTR ||
(tp != NULL && !tp->klass()->is_loaded())) {
// Value must be null, not a real oop.
- Node* chk = _gvn.transform( new (C) CmpPNode(l, null()) );
- Node* tst = _gvn.transform( new (C) BoolNode(chk, BoolTest::eq) );
+ Node* chk = _gvn.transform( new CmpPNode(l, null()) );
+ Node* tst = _gvn.transform( new BoolNode(chk, BoolTest::eq) );
IfNode* iff = create_and_map_if(control(), tst, PROB_MAX, COUNT_UNKNOWN);
- set_control(_gvn.transform( new (C) IfTrueNode(iff) ));
- Node* bad_type = _gvn.transform( new (C) IfFalseNode(iff) );
+ set_control(_gvn.transform( new IfTrueNode(iff) ));
+ Node* bad_type = _gvn.transform( new IfFalseNode(iff) );
bad_type_exit->control()->add_req(bad_type);
l = null();
}
@@ -220,7 +220,7 @@
Node *monitors_addr = basic_plus_adr(osr_buf, osr_buf, (max_locals+mcnt*2-1)*wordSize);
for (index = 0; index < mcnt; index++) {
// Make a BoxLockNode for the monitor.
- Node *box = _gvn.transform(new (C) BoxLockNode(next_monitor()));
+ Node *box = _gvn.transform(new BoxLockNode(next_monitor()));
// Displaced headers and locked objects are interleaved in the
@@ -235,7 +235,7 @@
// Build a bogus FastLockNode (no code will be generated) and push the
// monitor into our debug info.
- const FastLockNode *flock = _gvn.transform(new (C) FastLockNode( 0, lock_object, box ))->as_FastLock();
+ const FastLockNode *flock = _gvn.transform(new FastLockNode( 0, lock_object, box ))->as_FastLock();
map()->push_monitor(flock);
// If the lock is our method synchronization lock, tuck it away in
@@ -325,7 +325,7 @@
// Now that the interpreter state is loaded, make sure it will match
// at execution time what the compiler is expecting now:
SafePointNode* bad_type_exit = clone_map();
- bad_type_exit->set_control(new (C) RegionNode(1));
+ bad_type_exit->set_control(new RegionNode(1));
assert(osr_block->flow()->jsrs()->size() == 0, "should be no jsrs live at osr point");
for (index = 0; index < max_locals; index++) {
@@ -383,8 +383,8 @@
//------------------------------Parse------------------------------------------
// Main parser constructor.
-Parse::Parse(JVMState* caller, ciMethod* parse_method, float expected_uses, Parse* parent)
- : _exits(caller), _parent(parent)
+Parse::Parse(JVMState* caller, ciMethod* parse_method, float expected_uses)
+ : _exits(caller)
{
// Init some variables
_caller = caller;
@@ -399,6 +399,9 @@
_entry_bci = InvocationEntryBci;
_tf = NULL;
_block = NULL;
+ _first_return = true;
+ _replaced_nodes_for_exceptions = false;
+ _new_idx = C->unique();
debug_only(_block_count = -1);
debug_only(_blocks = (Block*)-1);
#ifndef PRODUCT
@@ -661,7 +664,7 @@
add_predicate();
// Add new region for back branches.
int edges = block->pred_count() - block->preds_parsed() + 1; // +1 for original region
- RegionNode *r = new (C) RegionNode(edges+1);
+ RegionNode *r = new RegionNode(edges+1);
_gvn.set_type(r, Type::CONTROL);
record_for_igvn(r);
r->init_req(edges, control());
@@ -728,14 +731,14 @@
_exits.clean_stack(_exits.sp());
_exits.sync_jvms();
- RegionNode* region = new (C) RegionNode(1);
+ RegionNode* region = new RegionNode(1);
record_for_igvn(region);
gvn().set_type_bottom(region);
_exits.set_control(region);
// Note: iophi and memphi are not transformed until do_exits.
- Node* iophi = new (C) PhiNode(region, Type::ABIO);
- Node* memphi = new (C) PhiNode(region, Type::MEMORY, TypePtr::BOTTOM);
+ Node* iophi = new PhiNode(region, Type::ABIO);
+ Node* memphi = new PhiNode(region, Type::MEMORY, TypePtr::BOTTOM);
gvn().set_type_bottom(iophi);
gvn().set_type_bottom(memphi);
_exits.set_i_o(iophi);
@@ -752,7 +755,7 @@
ret_type = TypeOopPtr::BOTTOM;
}
int ret_size = type2size[ret_type->basic_type()];
- Node* ret_phi = new (C) PhiNode(region, ret_type);
+ Node* ret_phi = new PhiNode(region, ret_type);
gvn().set_type_bottom(ret_phi);
_exits.ensure_stack(ret_size);
assert((int)(tf()->range()->cnt() - TypeFunc::Parms) == ret_size, "good tf range");
@@ -770,7 +773,7 @@
int arg_size = tf->domain()->cnt();
int max_size = MAX2(arg_size, (int)tf->range()->cnt());
JVMState* jvms = new (this) JVMState(max_size - TypeFunc::Parms);
- SafePointNode* map = new (this) SafePointNode(max_size, NULL);
+ SafePointNode* map = new SafePointNode(max_size, NULL);
record_for_igvn(map);
assert(arg_size == TypeFunc::Parms + (is_osr_compilation() ? 1 : method()->arg_size()), "correct arg_size");
Node_Notes* old_nn = default_node_notes();
@@ -784,7 +787,7 @@
}
uint i;
for (i = 0; i < (uint)arg_size; i++) {
- Node* parm = initial_gvn()->transform(new (this) ParmNode(start, i));
+ Node* parm = initial_gvn()->transform(new ParmNode(start, i));
map->init_req(i, parm);
// Record all these guys for later GVN.
record_for_igvn(parm);
@@ -815,7 +818,7 @@
//--------------------------return_values--------------------------------------
void Compile::return_values(JVMState* jvms) {
GraphKit kit(jvms);
- Node* ret = new (this) ReturnNode(TypeFunc::Parms,
+ Node* ret = new ReturnNode(TypeFunc::Parms,
kit.control(),
kit.i_o(),
kit.reset_memory(),
@@ -843,7 +846,7 @@
// Load my combined exception state into the kit, with all phis transformed:
SafePointNode* ex_map = kit.combine_and_pop_all_exception_states();
Node* ex_oop = kit.use_exception_state(ex_map);
- RethrowNode* exit = new (this) RethrowNode(kit.control(),
+ RethrowNode* exit = new RethrowNode(kit.control(),
kit.i_o(), kit.reset_memory(),
kit.frameptr(), kit.returnadr(),
// like a return but with exception input
@@ -901,6 +904,10 @@
for (uint i = 0; i < TypeFunc::Parms; i++) {
caller.map()->set_req(i, ex_map->in(i));
}
+ if (ex_map->has_replaced_nodes()) {
+ _replaced_nodes_for_exceptions = true;
+ }
+ caller.map()->transfer_replaced_nodes_from(ex_map, _new_idx);
// ...and the exception:
Node* ex_oop = saved_ex_oop(ex_map);
SafePointNode* caller_ex_map = caller.make_exception_state(ex_oop);
@@ -991,7 +998,7 @@
bool do_synch = method()->is_synchronized() && GenerateSynchronizationCode;
// record exit from a method if compiled while Dtrace is turned on.
- if (do_synch || C->env()->dtrace_method_probes()) {
+ if (do_synch || C->env()->dtrace_method_probes() || _replaced_nodes_for_exceptions) {
// First move the exception list out of _exits:
GraphKit kit(_exits.transfer_exceptions_into_jvms());
SafePointNode* normal_map = kit.map(); // keep this guy safe
@@ -1016,6 +1023,9 @@
if (C->env()->dtrace_method_probes()) {
kit.make_dtrace_method_exit(method());
}
+ if (_replaced_nodes_for_exceptions) {
+ kit.map()->apply_replaced_nodes();
+ }
// Done with exception-path processing.
ex_map = kit.make_exception_state(ex_oop);
assert(ex_jvms->same_calls_as(ex_map->jvms()), "sanity");
@@ -1035,6 +1045,7 @@
_exits.add_exception_state(ex_map);
}
}
+ _exits.map()->apply_replaced_nodes();
}
//-----------------------------create_entry_map-------------------------------
@@ -1049,6 +1060,9 @@
return NULL;
}
+ // clear current replaced nodes that are of no use from here on (map was cloned in build_exits).
+ _caller->map()->delete_replaced_nodes();
+
// If this is an inlined method, we may have to do a receiver null check.
if (_caller->has_method() && is_normal_parse() && !method()->is_static()) {
GraphKit kit(_caller);
@@ -1065,13 +1079,15 @@
// Create an initial safepoint to hold JVM state during parsing
JVMState* jvms = new (C) JVMState(method(), _caller->has_method() ? _caller : NULL);
- set_map(new (C) SafePointNode(len, jvms));
+ set_map(new SafePointNode(len, jvms));
jvms->set_map(map());
record_for_igvn(map());
assert(jvms->endoff() == len, "correct jvms sizing");
SafePointNode* inmap = _caller->map();
assert(inmap != NULL, "must have inmap");
+ // In case of null check on receiver above
+ map()->transfer_replaced_nodes_from(inmap, _new_idx);
uint i;
@@ -1578,7 +1594,7 @@
// later lazily.
int edges = target->pred_count();
if (edges < pnum) edges = pnum; // might be a new path!
- RegionNode *r = new (C) RegionNode(edges+1);
+ RegionNode *r = new RegionNode(edges+1);
gvn().set_type(r, Type::CONTROL);
record_for_igvn(r);
// zap all inputs to NULL for debugging (done in Node(uint) constructor)
@@ -1701,6 +1717,8 @@
set_control(r->nonnull_req());
}
+ map()->merge_replaced_nodes_with(newin);
+
// newin has been subsumed into the lazy merge, and is now dead.
set_block(save_block);
@@ -1973,19 +1991,19 @@
Node* access_flags_addr = basic_plus_adr(klass, klass, in_bytes(Klass::access_flags_offset()));
Node* access_flags = make_load(NULL, access_flags_addr, TypeInt::INT, T_INT, MemNode::unordered);
- Node* mask = _gvn.transform(new (C) AndINode(access_flags, intcon(JVM_ACC_HAS_FINALIZER)));
- Node* check = _gvn.transform(new (C) CmpINode(mask, intcon(0)));
- Node* test = _gvn.transform(new (C) BoolNode(check, BoolTest::ne));
+ Node* mask = _gvn.transform(new AndINode(access_flags, intcon(JVM_ACC_HAS_FINALIZER)));
+ Node* check = _gvn.transform(new CmpINode(mask, intcon(0)));
+ Node* test = _gvn.transform(new BoolNode(check, BoolTest::ne));
IfNode* iff = create_and_map_if(control(), test, PROB_MAX, COUNT_UNKNOWN);
- RegionNode* result_rgn = new (C) RegionNode(3);
+ RegionNode* result_rgn = new RegionNode(3);
record_for_igvn(result_rgn);
- Node *skip_register = _gvn.transform(new (C) IfFalseNode(iff));
+ Node *skip_register = _gvn.transform(new IfFalseNode(iff));
result_rgn->init_req(1, skip_register);
- Node *needs_register = _gvn.transform(new (C) IfTrueNode(iff));
+ Node *needs_register = _gvn.transform(new IfTrueNode(iff));
set_control(needs_register);
if (stopped()) {
// There is no slow path.
@@ -2039,9 +2057,9 @@
// or with ProfileRTM (cmp->in(2)) otherwise so that
// the check will fold.
Node* profile_state = makecon(TypeInt::make(ProfileRTM));
- Node* opq = _gvn.transform( new (C) Opaque3Node(C, rtm_state, Opaque3Node::RTM_OPT) );
- Node* chk = _gvn.transform( new (C) CmpINode(opq, profile_state) );
- Node* tst = _gvn.transform( new (C) BoolNode(chk, BoolTest::eq) );
+ Node* opq = _gvn.transform( new Opaque3Node(C, rtm_state, Opaque3Node::RTM_OPT) );
+ Node* chk = _gvn.transform( new CmpINode(opq, profile_state) );
+ Node* tst = _gvn.transform( new BoolNode(chk, BoolTest::eq) );
// Branch to failure if state was changed
{ BuildCutout unless(this, tst, PROB_ALWAYS);
uncommon_trap(Deoptimization::Reason_rtm_state_change,
@@ -2066,10 +2084,10 @@
Node* mc_adr = makecon(adr_type);
Node* cnt_adr = basic_plus_adr(mc_adr, mc_adr, in_bytes(MethodCounters::nmethod_age_offset()));
Node* cnt = make_load(control(), cnt_adr, TypeInt::INT, T_INT, adr_type, MemNode::unordered);
- Node* decr = _gvn.transform(new (C) SubINode(cnt, makecon(TypeInt::ONE)));
+ Node* decr = _gvn.transform(new SubINode(cnt, makecon(TypeInt::ONE)));
store_to_memory(control(), cnt_adr, decr, T_INT, adr_type, MemNode::unordered);
- Node *chk = _gvn.transform(new (C) CmpINode(decr, makecon(TypeInt::ZERO)));
- Node* tst = _gvn.transform(new (C) BoolNode(chk, BoolTest::gt));
+ Node *chk = _gvn.transform(new CmpINode(decr, makecon(TypeInt::ZERO)));
+ Node* tst = _gvn.transform(new BoolNode(chk, BoolTest::gt));
{ BuildCutout unless(this, tst, PROB_ALWAYS);
uncommon_trap(Deoptimization::Reason_tenured,
Deoptimization::Action_make_not_entrant);
@@ -2124,12 +2142,19 @@
// sharpen the type eagerly; this eases certain assert checking
if (tp->higher_equal(TypeInstPtr::NOTNULL))
tr = tr->join_speculative(TypeInstPtr::NOTNULL)->is_instptr();
- value = _gvn.transform(new (C) CheckCastPPNode(0,value,tr));
+ value = _gvn.transform(new CheckCastPPNode(0,value,tr));
}
}
phi->add_req(value);
}
+ if (_first_return) {
+ _exits.map()->transfer_replaced_nodes_from(map(), _new_idx);
+ _first_return = false;
+ } else {
+ _exits.map()->merge_replaced_nodes_with(map());
+ }
+
stop_and_kill_map(); // This CFG path dies here
}
@@ -2159,7 +2184,7 @@
kill_dead_locals();
// Clone the JVM State
- SafePointNode *sfpnt = new (C) SafePointNode(parms, NULL);
+ SafePointNode *sfpnt = new SafePointNode(parms, NULL);
// Capture memory state BEFORE a SafePoint. Since we can block at a
// SafePoint we need our GC state to be safe; i.e. we need all our current
--- a/hotspot/src/share/vm/opto/parse2.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/parse2.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -130,9 +130,9 @@
Node* len = load_array_length(ary);
// Test length vs index (standard trick using unsigned compare)
- Node* chk = _gvn.transform( new (C) CmpUNode(idx, len) );
+ Node* chk = _gvn.transform( new CmpUNode(idx, len) );
BoolTest::mask btest = BoolTest::lt;
- tst = _gvn.transform( new (C) BoolNode(chk, btest) );
+ tst = _gvn.transform( new BoolNode(chk, btest) );
}
// Branch to failure if out of bounds
{ BuildCutout unless(this, tst, PROB_MAX);
@@ -168,15 +168,15 @@
// returns IfNode
IfNode* Parse::jump_if_fork_int(Node* a, Node* b, BoolTest::mask mask) {
- Node *cmp = _gvn.transform( new (C) CmpINode( a, b)); // two cases: shiftcount > 32 and shiftcount <= 32
- Node *tst = _gvn.transform( new (C) BoolNode( cmp, mask));
+ Node *cmp = _gvn.transform( new CmpINode( a, b)); // two cases: shiftcount > 32 and shiftcount <= 32
+ Node *tst = _gvn.transform( new BoolNode( cmp, mask));
IfNode *iff = create_and_map_if( control(), tst, ((mask == BoolTest::eq) ? PROB_STATIC_INFREQUENT : PROB_FAIR), COUNT_UNKNOWN );
return iff;
}
// return Region node
Node* Parse::jump_if_join(Node* iffalse, Node* iftrue) {
- Node *region = new (C) RegionNode(3); // 2 results
+ Node *region = new RegionNode(3); // 2 results
record_for_igvn(region);
region->init_req(1, iffalse);
region->init_req(2, iftrue );
@@ -191,28 +191,28 @@
void Parse::jump_if_true_fork(IfNode *iff, int dest_bci_if_true, int prof_table_index) {
// True branch, use existing map info
{ PreserveJVMState pjvms(this);
- Node *iftrue = _gvn.transform( new (C) IfTrueNode (iff) );
+ Node *iftrue = _gvn.transform( new IfTrueNode (iff) );
set_control( iftrue );
profile_switch_case(prof_table_index);
merge_new_path(dest_bci_if_true);
}
// False branch
- Node *iffalse = _gvn.transform( new (C) IfFalseNode(iff) );
+ Node *iffalse = _gvn.transform( new IfFalseNode(iff) );
set_control( iffalse );
}
void Parse::jump_if_false_fork(IfNode *iff, int dest_bci_if_true, int prof_table_index) {
// True branch, use existing map info
{ PreserveJVMState pjvms(this);
- Node *iffalse = _gvn.transform( new (C) IfFalseNode (iff) );
+ Node *iffalse = _gvn.transform( new IfFalseNode (iff) );
set_control( iffalse );
profile_switch_case(prof_table_index);
merge_new_path(dest_bci_if_true);
}
// False branch
- Node *iftrue = _gvn.transform( new (C) IfTrueNode(iff) );
+ Node *iftrue = _gvn.transform( new IfTrueNode(iff) );
set_control( iftrue );
}
@@ -440,14 +440,14 @@
// Normalize table lookups to zero
int lowval = lo->lo();
- key_val = _gvn.transform( new (C) SubINode(key_val, _gvn.intcon(lowval)) );
+ key_val = _gvn.transform( new SubINode(key_val, _gvn.intcon(lowval)) );
// Generate a guard to protect against input keyvals that aren't
// in the switch domain.
if (needs_guard) {
Node* size = _gvn.intcon(num_cases);
- Node* cmp = _gvn.transform( new (C) CmpUNode(key_val, size) );
- Node* tst = _gvn.transform( new (C) BoolNode(cmp, BoolTest::ge) );
+ Node* cmp = _gvn.transform( new CmpUNode(key_val, size) );
+ Node* tst = _gvn.transform( new BoolNode(cmp, BoolTest::ge) );
IfNode* iff = create_and_map_if( control(), tst, PROB_FAIR, COUNT_UNKNOWN);
jump_if_true_fork(iff, default_dest, NullTableIndex);
}
@@ -460,21 +460,21 @@
// Clean the 32-bit int into a real 64-bit offset.
// Otherwise, the jint value 0 might turn into an offset of 0x0800000000.
const TypeLong* lkeytype = TypeLong::make(CONST64(0), num_cases-1, Type::WidenMin);
- key_val = _gvn.transform( new (C) ConvI2LNode(key_val, lkeytype) );
+ key_val = _gvn.transform( new ConvI2LNode(key_val, lkeytype) );
#endif
// Shift the value by wordsize so we have an index into the table, rather
// than a switch value
Node *shiftWord = _gvn.MakeConX(wordSize);
- key_val = _gvn.transform( new (C) MulXNode( key_val, shiftWord));
+ key_val = _gvn.transform( new MulXNode( key_val, shiftWord));
// Create the JumpNode
- Node* jtn = _gvn.transform( new (C) JumpNode(control(), key_val, num_cases) );
+ Node* jtn = _gvn.transform( new JumpNode(control(), key_val, num_cases) );
// These are the switch destinations hanging off the jumpnode
int i = 0;
for (SwitchRange* r = lo; r <= hi; r++) {
for (int64_t j = r->lo(); j <= r->hi(); j++, i++) {
- Node* input = _gvn.transform(new (C) JumpProjNode(jtn, i, r->dest(), (int)(j - lowval)));
+ Node* input = _gvn.transform(new JumpProjNode(jtn, i, r->dest(), (int)(j - lowval)));
{
PreserveJVMState pjvms(this);
set_control(input);
@@ -575,8 +575,8 @@
// two comparisons of same values--should enable 1 test for 2 branches
// Use BoolTest::le instead of BoolTest::gt
IfNode *iff_le = jump_if_fork_int(key_val, test_val, BoolTest::le);
- Node *iftrue = _gvn.transform( new (C) IfTrueNode(iff_le) );
- Node *iffalse = _gvn.transform( new (C) IfFalseNode(iff_le) );
+ Node *iftrue = _gvn.transform( new IfTrueNode(iff_le) );
+ Node *iffalse = _gvn.transform( new IfFalseNode(iff_le) );
{ PreserveJVMState pjvms(this);
set_control(iffalse);
jump_switch_ranges(key_val, mid+1, hi, switch_depth+1);
@@ -592,8 +592,8 @@
if (mid == hi) {
jump_if_true_fork(iff_ge, mid->dest(), mid->table_index());
} else {
- Node *iftrue = _gvn.transform( new (C) IfTrueNode(iff_ge) );
- Node *iffalse = _gvn.transform( new (C) IfFalseNode(iff_ge) );
+ Node *iftrue = _gvn.transform( new IfTrueNode(iff_ge) );
+ Node *iffalse = _gvn.transform( new IfFalseNode(iff_ge) );
{ PreserveJVMState pjvms(this);
set_control(iftrue);
jump_switch_ranges(key_val, mid, hi, switch_depth+1);
@@ -648,7 +648,7 @@
CAST_FROM_FN_PTR(address, SharedRuntime::frem),
"frem", NULL, //no memory effects
f1, f2);
- Node* res = _gvn.transform(new (C) ProjNode(c, TypeFunc::Parms + 0));
+ Node* res = _gvn.transform(new ProjNode(c, TypeFunc::Parms + 0));
push(res);
}
@@ -660,10 +660,10 @@
CAST_FROM_FN_PTR(address, SharedRuntime::drem),
"drem", NULL, //no memory effects
d1, top(), d2, top());
- Node* res_d = _gvn.transform(new (C) ProjNode(c, TypeFunc::Parms + 0));
+ Node* res_d = _gvn.transform(new ProjNode(c, TypeFunc::Parms + 0));
#ifdef ASSERT
- Node* res_top = _gvn.transform(new (C) ProjNode(c, TypeFunc::Parms + 1));
+ Node* res_top = _gvn.transform(new ProjNode(c, TypeFunc::Parms + 1));
assert(res_top == top(), "second value must be top");
#endif
@@ -677,7 +677,7 @@
CAST_FROM_FN_PTR(address, SharedRuntime::l2f),
"l2f", NULL, //no memory effects
f1, f2);
- Node* res = _gvn.transform(new (C) ProjNode(c, TypeFunc::Parms + 0));
+ Node* res = _gvn.transform(new ProjNode(c, TypeFunc::Parms + 0));
push(res);
}
@@ -704,17 +704,17 @@
// Sigh, must handle negative dividends
Node *zero = _gvn.intcon(0);
IfNode *ifff = jump_if_fork_int(a, zero, BoolTest::lt);
- Node *iff = _gvn.transform( new (C) IfFalseNode(ifff) );
- Node *ift = _gvn.transform( new (C) IfTrueNode (ifff) );
+ Node *iff = _gvn.transform( new IfFalseNode(ifff) );
+ Node *ift = _gvn.transform( new IfTrueNode (ifff) );
Node *reg = jump_if_join(ift, iff);
Node *phi = PhiNode::make(reg, NULL, TypeInt::INT);
// Negative path; negate/and/negate
- Node *neg = _gvn.transform( new (C) SubINode(zero, a) );
- Node *andn= _gvn.transform( new (C) AndINode(neg, mask) );
- Node *negn= _gvn.transform( new (C) SubINode(zero, andn) );
+ Node *neg = _gvn.transform( new SubINode(zero, a) );
+ Node *andn= _gvn.transform( new AndINode(neg, mask) );
+ Node *negn= _gvn.transform( new SubINode(zero, andn) );
phi->init_req(1, negn);
// Fast positive case
- Node *andx = _gvn.transform( new (C) AndINode(a, mask) );
+ Node *andx = _gvn.transform( new AndINode(a, mask) );
phi->init_req(2, andx);
// Push the merge
push( _gvn.transform(phi) );
@@ -723,7 +723,7 @@
}
}
// Default case
- push( _gvn.transform( new (C) ModINode(control(),a,b) ) );
+ push( _gvn.transform( new ModINode(control(),a,b) ) );
}
// Handle jsr and jsr_w bytecode
@@ -897,53 +897,12 @@
// if a path is never taken, its controlling comparison is
// already acting in a stable fashion. If the comparison
// seems stable, we will put an expensive uncommon trap
-// on the untaken path. To be conservative, and to allow
-// partially executed counted loops to be compiled fully,
-// we will plant uncommon traps only after pointer comparisons.
+// on the untaken path.
bool Parse::seems_stable_comparison(BoolTest::mask btest, Node* cmp) {
- for (int depth = 4; depth > 0; depth--) {
- // The following switch can find CmpP here over half the time for
- // dynamic language code rich with type tests.
- // Code using counted loops or array manipulations (typical
- // of benchmarks) will have many (>80%) CmpI instructions.
- switch (cmp->Opcode()) {
- case Op_CmpP:
- // A never-taken null check looks like CmpP/BoolTest::eq.
- // These certainly should be closed off as uncommon traps.
- if (btest == BoolTest::eq)
- return true;
- // A never-failed type check looks like CmpP/BoolTest::ne.
- // Let's put traps on those, too, so that we don't have to compile
- // unused paths with indeterminate dynamic type information.
- if (ProfileDynamicTypes)
- return true;
- return false;
-
- case Op_CmpI:
- // A small minority (< 10%) of CmpP are masked as CmpI,
- // as if by boolean conversion ((p == q? 1: 0) != 0).
- // Detect that here, even if it hasn't optimized away yet.
- // Specifically, this covers the 'instanceof' operator.
- if (btest == BoolTest::ne || btest == BoolTest::eq) {
- if (_gvn.type(cmp->in(2))->singleton() &&
- cmp->in(1)->is_Phi()) {
- PhiNode* phi = cmp->in(1)->as_Phi();
- int true_path = phi->is_diamond_phi();
- if (true_path > 0 &&
- _gvn.type(phi->in(1))->singleton() &&
- _gvn.type(phi->in(2))->singleton()) {
- // phi->region->if_proj->ifnode->bool->cmp
- BoolNode* bol = phi->in(0)->in(1)->in(0)->in(1)->as_Bool();
- btest = bol->_test._test;
- cmp = bol->in(1);
- continue;
- }
- }
- }
- return false;
- }
+ if (C->too_many_traps(method(), bci(), Deoptimization::Reason_unstable_if)) {
+ return false;
}
- return false;
+ return true;
}
//-------------------------------repush_if_args--------------------------------
@@ -1000,7 +959,7 @@
explicit_null_checks_inserted++;
// Generate real control flow
- Node *tst = _gvn.transform( new (C) BoolNode( c, btest ) );
+ Node *tst = _gvn.transform( new BoolNode( c, btest ) );
// Sanity check the probability value
assert(prob > 0.0f,"Bad probability in Parser");
@@ -1009,7 +968,7 @@
assert(iff->_prob > 0.0f,"Optimizer made bad probability in parser");
// True branch
{ PreserveJVMState pjvms(this);
- Node* iftrue = _gvn.transform( new (C) IfTrueNode (iff) );
+ Node* iftrue = _gvn.transform( new IfTrueNode (iff) );
set_control(iftrue);
if (stopped()) { // Path is dead?
@@ -1029,7 +988,7 @@
}
// False branch
- Node* iffalse = _gvn.transform( new (C) IfFalseNode(iff) );
+ Node* iffalse = _gvn.transform( new IfFalseNode(iff) );
set_control(iffalse);
if (stopped()) { // Path is dead?
@@ -1092,7 +1051,7 @@
}
assert(btest != BoolTest::eq, "!= is the only canonical exact test");
- Node* tst0 = new (C) BoolNode(c, btest);
+ Node* tst0 = new BoolNode(c, btest);
Node* tst = _gvn.transform(tst0);
BoolTest::mask taken_btest = BoolTest::illegal;
BoolTest::mask untaken_btest = BoolTest::illegal;
@@ -1123,8 +1082,8 @@
float true_prob = (taken_if_true ? prob : untaken_prob);
IfNode* iff = create_and_map_if(control(), tst, true_prob, cnt);
assert(iff->_prob > 0.0f,"Optimizer made bad probability in parser");
- Node* taken_branch = new (C) IfTrueNode(iff);
- Node* untaken_branch = new (C) IfFalseNode(iff);
+ Node* taken_branch = new IfTrueNode(iff);
+ Node* untaken_branch = new IfFalseNode(iff);
if (!taken_if_true) { // Finish conversion to canonical form
Node* tmp = taken_branch;
taken_branch = untaken_branch;
@@ -1182,32 +1141,8 @@
bool is_fallthrough = (path == successor_for_bci(iter().next_bci()));
if (seems_never_taken(prob) && seems_stable_comparison(btest, c)) {
- // If this might possibly turn into an implicit null check,
- // and the null has never yet been seen, we need to generate
- // an uncommon trap, so as to recompile instead of suffering
- // with very slow branches. (We'll get the slow branches if
- // the program ever changes phase and starts seeing nulls here.)
- //
- // We do not inspect for a null constant, since a node may
- // optimize to 'null' later on.
- //
- // Null checks, and other tests which expect inequality,
- // show btest == BoolTest::eq along the non-taken branch.
- // On the other hand, type tests, must-be-null tests,
- // and other tests which expect pointer equality,
- // show btest == BoolTest::ne along the non-taken branch.
- // We prune both types of branches if they look unused.
repush_if_args();
- // We need to mark this branch as taken so that if we recompile we will
- // see that it is possible. In the tiered system the interpreter doesn't
- // do profiling and by the time we get to the lower tier from the interpreter
- // the path may be cold again. Make sure it doesn't look untaken
- if (is_fallthrough) {
- profile_not_taken_branch(!ProfileInterpreter);
- } else {
- profile_taken_branch(iter().get_dest(), !ProfileInterpreter);
- }
- uncommon_trap(Deoptimization::Reason_unreached,
+ uncommon_trap(Deoptimization::Reason_unstable_if,
Deoptimization::Action_reinterpret,
NULL,
(is_fallthrough ? "taken always" : "taken never"));
@@ -1288,7 +1223,7 @@
JVMState* jvms = this->jvms();
if (obj_in_map >= 0 &&
(jvms->is_loc(obj_in_map) || jvms->is_stk(obj_in_map))) {
- TypeNode* ccast = new (C) CheckCastPPNode(control(), obj, tboth);
+ TypeNode* ccast = new CheckCastPPNode(control(), obj, tboth);
const Type* tcc = ccast->as_Type()->type();
assert(tcc != obj_type && tcc->higher_equal(obj_type), "must improve");
// Delay transform() call to allow recovery of pre-cast value
@@ -1323,10 +1258,10 @@
const Type* tboth = tcon->join_speculative(tval);
if (tboth == tval) break; // Nothing to gain.
if (tcon->isa_int()) {
- ccast = new (C) CastIINode(val, tboth);
+ ccast = new CastIINode(val, tboth);
} else if (tcon == TypePtr::NULL_PTR) {
// Cast to null, but keep the pointer identity temporarily live.
- ccast = new (C) CastPPNode(val, tboth);
+ ccast = new CastPPNode(val, tboth);
} else {
const TypeF* tf = tcon->isa_float_constant();
const TypeD* td = tcon->isa_double_constant();
@@ -1792,59 +1727,59 @@
if (stopped()) return;
b = pop();
a = pop();
- push( _gvn.transform( new (C) DivINode(control(),a,b) ) );
+ push( _gvn.transform( new DivINode(control(),a,b) ) );
break;
case Bytecodes::_imul:
b = pop(); a = pop();
- push( _gvn.transform( new (C) MulINode(a,b) ) );
+ push( _gvn.transform( new MulINode(a,b) ) );
break;
case Bytecodes::_iadd:
b = pop(); a = pop();
- push( _gvn.transform( new (C) AddINode(a,b) ) );
+ push( _gvn.transform( new AddINode(a,b) ) );
break;
case Bytecodes::_ineg:
a = pop();
- push( _gvn.transform( new (C) SubINode(_gvn.intcon(0),a)) );
+ push( _gvn.transform( new SubINode(_gvn.intcon(0),a)) );
break;
case Bytecodes::_isub:
b = pop(); a = pop();
- push( _gvn.transform( new (C) SubINode(a,b) ) );
+ push( _gvn.transform( new SubINode(a,b) ) );
break;
case Bytecodes::_iand:
b = pop(); a = pop();
- push( _gvn.transform( new (C) AndINode(a,b) ) );
+ push( _gvn.transform( new AndINode(a,b) ) );
break;
case Bytecodes::_ior:
b = pop(); a = pop();
- push( _gvn.transform( new (C) OrINode(a,b) ) );
+ push( _gvn.transform( new OrINode(a,b) ) );
break;
case Bytecodes::_ixor:
b = pop(); a = pop();
- push( _gvn.transform( new (C) XorINode(a,b) ) );
+ push( _gvn.transform( new XorINode(a,b) ) );
break;
case Bytecodes::_ishl:
b = pop(); a = pop();
- push( _gvn.transform( new (C) LShiftINode(a,b) ) );
+ push( _gvn.transform( new LShiftINode(a,b) ) );
break;
case Bytecodes::_ishr:
b = pop(); a = pop();
- push( _gvn.transform( new (C) RShiftINode(a,b) ) );
+ push( _gvn.transform( new RShiftINode(a,b) ) );
break;
case Bytecodes::_iushr:
b = pop(); a = pop();
- push( _gvn.transform( new (C) URShiftINode(a,b) ) );
+ push( _gvn.transform( new URShiftINode(a,b) ) );
break;
case Bytecodes::_fneg:
a = pop();
- b = _gvn.transform(new (C) NegFNode (a));
+ b = _gvn.transform(new NegFNode (a));
push(b);
break;
case Bytecodes::_fsub:
b = pop();
a = pop();
- c = _gvn.transform( new (C) SubFNode(a,b) );
+ c = _gvn.transform( new SubFNode(a,b) );
d = precision_rounding(c);
push( d );
break;
@@ -1852,7 +1787,7 @@
case Bytecodes::_fadd:
b = pop();
a = pop();
- c = _gvn.transform( new (C) AddFNode(a,b) );
+ c = _gvn.transform( new AddFNode(a,b) );
d = precision_rounding(c);
push( d );
break;
@@ -1860,7 +1795,7 @@
case Bytecodes::_fmul:
b = pop();
a = pop();
- c = _gvn.transform( new (C) MulFNode(a,b) );
+ c = _gvn.transform( new MulFNode(a,b) );
d = precision_rounding(c);
push( d );
break;
@@ -1868,7 +1803,7 @@
case Bytecodes::_fdiv:
b = pop();
a = pop();
- c = _gvn.transform( new (C) DivFNode(0,a,b) );
+ c = _gvn.transform( new DivFNode(0,a,b) );
d = precision_rounding(c);
push( d );
break;
@@ -1878,7 +1813,7 @@
// Generate a ModF node.
b = pop();
a = pop();
- c = _gvn.transform( new (C) ModFNode(0,a,b) );
+ c = _gvn.transform( new ModFNode(0,a,b) );
d = precision_rounding(c);
push( d );
}
@@ -1891,7 +1826,7 @@
case Bytecodes::_fcmpl:
b = pop();
a = pop();
- c = _gvn.transform( new (C) CmpF3Node( a, b));
+ c = _gvn.transform( new CmpF3Node( a, b));
push(c);
break;
case Bytecodes::_fcmpg:
@@ -1903,40 +1838,40 @@
// as well by using CmpF3 which implements unordered-lesser instead of
// unordered-greater semantics. Finally, commute the result bits. Result
// is same as using a CmpF3Greater except we did it with CmpF3 alone.
- c = _gvn.transform( new (C) CmpF3Node( b, a));
- c = _gvn.transform( new (C) SubINode(_gvn.intcon(0),c) );
+ c = _gvn.transform( new CmpF3Node( b, a));
+ c = _gvn.transform( new SubINode(_gvn.intcon(0),c) );
push(c);
break;
case Bytecodes::_f2i:
a = pop();
- push(_gvn.transform(new (C) ConvF2INode(a)));
+ push(_gvn.transform(new ConvF2INode(a)));
break;
case Bytecodes::_d2i:
a = pop_pair();
- b = _gvn.transform(new (C) ConvD2INode(a));
+ b = _gvn.transform(new ConvD2INode(a));
push( b );
break;
case Bytecodes::_f2d:
a = pop();
- b = _gvn.transform( new (C) ConvF2DNode(a));
+ b = _gvn.transform( new ConvF2DNode(a));
push_pair( b );
break;
case Bytecodes::_d2f:
a = pop_pair();
- b = _gvn.transform( new (C) ConvD2FNode(a));
+ b = _gvn.transform( new ConvD2FNode(a));
// This breaks _227_mtrt (speed & correctness) and _222_mpegaudio (speed)
- //b = _gvn.transform(new (C) RoundFloatNode(0, b) );
+ //b = _gvn.transform(new RoundFloatNode(0, b) );
push( b );
break;
case Bytecodes::_l2f:
if (Matcher::convL2FSupported()) {
a = pop_pair();
- b = _gvn.transform( new (C) ConvL2FNode(a));
+ b = _gvn.transform( new ConvL2FNode(a));
// For i486.ad, FILD doesn't restrict precision to 24 or 53 bits.
// Rather than storing the result into an FP register then pushing
// out to memory to round, the machine instruction that implements
@@ -1951,7 +1886,7 @@
case Bytecodes::_l2d:
a = pop_pair();
- b = _gvn.transform( new (C) ConvL2DNode(a));
+ b = _gvn.transform( new ConvL2DNode(a));
// For i486.ad, rounding is always necessary (see _l2f above).
// c = dprecision_rounding(b);
c = _gvn.transform(b);
@@ -1960,20 +1895,20 @@
case Bytecodes::_f2l:
a = pop();
- b = _gvn.transform( new (C) ConvF2LNode(a));
+ b = _gvn.transform( new ConvF2LNode(a));
push_pair(b);
break;
case Bytecodes::_d2l:
a = pop_pair();
- b = _gvn.transform( new (C) ConvD2LNode(a));
+ b = _gvn.transform( new ConvD2LNode(a));
push_pair(b);
break;
case Bytecodes::_dsub:
b = pop_pair();
a = pop_pair();
- c = _gvn.transform( new (C) SubDNode(a,b) );
+ c = _gvn.transform( new SubDNode(a,b) );
d = dprecision_rounding(c);
push_pair( d );
break;
@@ -1981,7 +1916,7 @@
case Bytecodes::_dadd:
b = pop_pair();
a = pop_pair();
- c = _gvn.transform( new (C) AddDNode(a,b) );
+ c = _gvn.transform( new AddDNode(a,b) );
d = dprecision_rounding(c);
push_pair( d );
break;
@@ -1989,7 +1924,7 @@
case Bytecodes::_dmul:
b = pop_pair();
a = pop_pair();
- c = _gvn.transform( new (C) MulDNode(a,b) );
+ c = _gvn.transform( new MulDNode(a,b) );
d = dprecision_rounding(c);
push_pair( d );
break;
@@ -1997,14 +1932,14 @@
case Bytecodes::_ddiv:
b = pop_pair();
a = pop_pair();
- c = _gvn.transform( new (C) DivDNode(0,a,b) );
+ c = _gvn.transform( new DivDNode(0,a,b) );
d = dprecision_rounding(c);
push_pair( d );
break;
case Bytecodes::_dneg:
a = pop_pair();
- b = _gvn.transform(new (C) NegDNode (a));
+ b = _gvn.transform(new NegDNode (a));
push_pair(b);
break;
@@ -2015,7 +1950,7 @@
a = pop_pair();
// a % b
- c = _gvn.transform( new (C) ModDNode(0,a,b) );
+ c = _gvn.transform( new ModDNode(0,a,b) );
d = dprecision_rounding(c);
push_pair( d );
}
@@ -2028,7 +1963,7 @@
case Bytecodes::_dcmpl:
b = pop_pair();
a = pop_pair();
- c = _gvn.transform( new (C) CmpD3Node( a, b));
+ c = _gvn.transform( new CmpD3Node( a, b));
push(c);
break;
@@ -2041,8 +1976,8 @@
// unordered-lesser instead of unordered-greater semantics.
// Finally, negate the result bits. Result is same as using a
// CmpD3Greater except we did it with CmpD3 alone.
- c = _gvn.transform( new (C) CmpD3Node( b, a));
- c = _gvn.transform( new (C) SubINode(_gvn.intcon(0),c) );
+ c = _gvn.transform( new CmpD3Node( b, a));
+ c = _gvn.transform( new SubINode(_gvn.intcon(0),c) );
push(c);
break;
@@ -2051,44 +1986,44 @@
case Bytecodes::_land:
b = pop_pair();
a = pop_pair();
- c = _gvn.transform( new (C) AndLNode(a,b) );
+ c = _gvn.transform( new AndLNode(a,b) );
push_pair(c);
break;
case Bytecodes::_lor:
b = pop_pair();
a = pop_pair();
- c = _gvn.transform( new (C) OrLNode(a,b) );
+ c = _gvn.transform( new OrLNode(a,b) );
push_pair(c);
break;
case Bytecodes::_lxor:
b = pop_pair();
a = pop_pair();
- c = _gvn.transform( new (C) XorLNode(a,b) );
+ c = _gvn.transform( new XorLNode(a,b) );
push_pair(c);
break;
case Bytecodes::_lshl:
b = pop(); // the shift count
a = pop_pair(); // value to be shifted
- c = _gvn.transform( new (C) LShiftLNode(a,b) );
+ c = _gvn.transform( new LShiftLNode(a,b) );
push_pair(c);
break;
case Bytecodes::_lshr:
b = pop(); // the shift count
a = pop_pair(); // value to be shifted
- c = _gvn.transform( new (C) RShiftLNode(a,b) );
+ c = _gvn.transform( new RShiftLNode(a,b) );
push_pair(c);
break;
case Bytecodes::_lushr:
b = pop(); // the shift count
a = pop_pair(); // value to be shifted
- c = _gvn.transform( new (C) URShiftLNode(a,b) );
+ c = _gvn.transform( new URShiftLNode(a,b) );
push_pair(c);
break;
case Bytecodes::_lmul:
b = pop_pair();
a = pop_pair();
- c = _gvn.transform( new (C) MulLNode(a,b) );
+ c = _gvn.transform( new MulLNode(a,b) );
push_pair(c);
break;
@@ -2100,7 +2035,7 @@
if (stopped()) return;
b = pop_pair();
a = pop_pair();
- c = _gvn.transform( new (C) ModLNode(control(),a,b) );
+ c = _gvn.transform( new ModLNode(control(),a,b) );
push_pair(c);
break;
@@ -2112,20 +2047,20 @@
if (stopped()) return;
b = pop_pair();
a = pop_pair();
- c = _gvn.transform( new (C) DivLNode(control(),a,b) );
+ c = _gvn.transform( new DivLNode(control(),a,b) );
push_pair(c);
break;
case Bytecodes::_ladd:
b = pop_pair();
a = pop_pair();
- c = _gvn.transform( new (C) AddLNode(a,b) );
+ c = _gvn.transform( new AddLNode(a,b) );
push_pair(c);
break;
case Bytecodes::_lsub:
b = pop_pair();
a = pop_pair();
- c = _gvn.transform( new (C) SubLNode(a,b) );
+ c = _gvn.transform( new SubLNode(a,b) );
push_pair(c);
break;
case Bytecodes::_lcmp:
@@ -2156,58 +2091,58 @@
}
b = pop_pair();
a = pop_pair();
- c = _gvn.transform( new (C) CmpL3Node( a, b ));
+ c = _gvn.transform( new CmpL3Node( a, b ));
push(c);
break;
case Bytecodes::_lneg:
a = pop_pair();
- b = _gvn.transform( new (C) SubLNode(longcon(0),a));
+ b = _gvn.transform( new SubLNode(longcon(0),a));
push_pair(b);
break;
case Bytecodes::_l2i:
a = pop_pair();
- push( _gvn.transform( new (C) ConvL2INode(a)));
+ push( _gvn.transform( new ConvL2INode(a)));
break;
case Bytecodes::_i2l:
a = pop();
- b = _gvn.transform( new (C) ConvI2LNode(a));
+ b = _gvn.transform( new ConvI2LNode(a));
push_pair(b);
break;
case Bytecodes::_i2b:
// Sign extend
a = pop();
- a = _gvn.transform( new (C) LShiftINode(a,_gvn.intcon(24)) );
- a = _gvn.transform( new (C) RShiftINode(a,_gvn.intcon(24)) );
+ a = _gvn.transform( new LShiftINode(a,_gvn.intcon(24)) );
+ a = _gvn.transform( new RShiftINode(a,_gvn.intcon(24)) );
push( a );
break;
case Bytecodes::_i2s:
a = pop();
- a = _gvn.transform( new (C) LShiftINode(a,_gvn.intcon(16)) );
- a = _gvn.transform( new (C) RShiftINode(a,_gvn.intcon(16)) );
+ a = _gvn.transform( new LShiftINode(a,_gvn.intcon(16)) );
+ a = _gvn.transform( new RShiftINode(a,_gvn.intcon(16)) );
push( a );
break;
case Bytecodes::_i2c:
a = pop();
- push( _gvn.transform( new (C) AndINode(a,_gvn.intcon(0xFFFF)) ) );
+ push( _gvn.transform( new AndINode(a,_gvn.intcon(0xFFFF)) ) );
break;
case Bytecodes::_i2f:
a = pop();
- b = _gvn.transform( new (C) ConvI2FNode(a) ) ;
+ b = _gvn.transform( new ConvI2FNode(a) ) ;
c = precision_rounding(b);
push (b);
break;
case Bytecodes::_i2d:
a = pop();
- b = _gvn.transform( new (C) ConvI2DNode(a));
+ b = _gvn.transform( new ConvI2DNode(a));
push_pair(b);
break;
case Bytecodes::_iinc: // Increment local
i = iter().get_index(); // Get local index
- set_local( i, _gvn.transform( new (C) AddINode( _gvn.intcon(iter().get_iinc_con()), local(i) ) ) );
+ set_local( i, _gvn.transform( new AddINode( _gvn.intcon(iter().get_iinc_con()), local(i) ) ) );
break;
// Exit points of synchronized methods must have an unlock node
@@ -2287,7 +2222,7 @@
assert(null_ctl->is_top(), "no null control here");
dec_sp(1);
}
- c = _gvn.transform( new (C) CmpPNode(b, a) );
+ c = _gvn.transform( new CmpPNode(b, a) );
do_ifnull(btest, c);
break;
@@ -2298,7 +2233,7 @@
maybe_add_safepoint(iter().get_dest());
a = pop();
b = pop();
- c = _gvn.transform( new (C) CmpPNode(b, a) );
+ c = _gvn.transform( new CmpPNode(b, a) );
c = optimize_cmp_with_klass(c);
do_if(btest, c);
break;
@@ -2314,7 +2249,7 @@
maybe_add_safepoint(iter().get_dest());
a = _gvn.intcon(0);
b = pop();
- c = _gvn.transform( new (C) CmpINode(b, a) );
+ c = _gvn.transform( new CmpINode(b, a) );
do_if(btest, c);
break;
@@ -2329,7 +2264,7 @@
maybe_add_safepoint(iter().get_dest());
a = pop();
b = pop();
- c = _gvn.transform( new (C) CmpINode( b, a ) );
+ c = _gvn.transform( new CmpINode( b, a ) );
do_if(btest, c);
break;
--- a/hotspot/src/share/vm/opto/parse3.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/parse3.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -552,7 +552,7 @@
}
make_slow_call_ex(c, env()->Throwable_klass(), false);
- Node* res = _gvn.transform(new (C) ProjNode(c, TypeFunc::Parms));
+ Node* res = _gvn.transform(new ProjNode(c, TypeFunc::Parms));
const Type* type = TypeOopPtr::make_from_klass_raw(array_klass);
@@ -566,7 +566,7 @@
// We cannot sharpen the nested sub-arrays, since the top level is mutable.
- Node* cast = _gvn.transform( new (C) CheckCastPPNode(control(), res, type) );
+ Node* cast = _gvn.transform( new CheckCastPPNode(control(), res, type) );
push(cast);
// Possible improvements:
--- a/hotspot/src/share/vm/opto/parseHelper.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/parseHelper.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -43,7 +43,7 @@
const char *call_name = is_entry ? "dtrace_method_entry" : "dtrace_method_exit";
// Get base of thread-local storage area
- Node* thread = _gvn.transform( new (C) ThreadLocalNode() );
+ Node* thread = _gvn.transform( new ThreadLocalNode() );
// Get method
const TypePtr* method_type = TypeMetadataPtr::make(method);
@@ -175,8 +175,8 @@
// Make a constant out of the inexact array klass
const TypeKlassPtr *extak = tak->cast_to_exactness(true)->is_klassptr();
Node* con = makecon(extak);
- Node* cmp = _gvn.transform(new (C) CmpPNode( array_klass, con ));
- Node* bol = _gvn.transform(new (C) BoolNode( cmp, BoolTest::eq ));
+ Node* cmp = _gvn.transform(new CmpPNode( array_klass, con ));
+ Node* bol = _gvn.transform(new BoolNode( cmp, BoolTest::eq ));
Node* ctrl= control();
{ BuildCutout unless(this, bol, PROB_MAX);
uncommon_trap(Deoptimization::Reason_array_check,
@@ -215,8 +215,8 @@
// if (klass->_init_thread != current_thread ||
// klass->_init_state != being_initialized)
// uncommon_trap
- Node* cur_thread = _gvn.transform( new (C) ThreadLocalNode() );
- Node* merge = new (C) RegionNode(3);
+ Node* cur_thread = _gvn.transform( new ThreadLocalNode() );
+ Node* merge = new RegionNode(3);
_gvn.set_type(merge, Type::CONTROL);
Node* kls = makecon(TypeKlassPtr::make(klass));
@@ -327,9 +327,9 @@
// Test invocation count vs threshold
Node *threshold = makecon(TypeInt::make(limit));
- Node *chk = _gvn.transform( new (C) CmpUNode( cnt, threshold) );
+ Node *chk = _gvn.transform( new CmpUNode( cnt, threshold) );
BoolTest::mask btest = BoolTest::lt;
- Node *tst = _gvn.transform( new (C) BoolNode( chk, btest) );
+ Node *tst = _gvn.transform( new BoolNode( chk, btest) );
// Branch to failure if threshold exceeded
{ BuildCutout unless(this, tst, PROB_ALWAYS);
uncommon_trap(Deoptimization::Reason_age,
@@ -359,7 +359,7 @@
test_counter_against_threshold(cnt, limit);
// Add one to the counter and store
- Node* incr = _gvn.transform(new (C) AddINode(cnt, _gvn.intcon(1)));
+ Node* incr = _gvn.transform(new AddINode(cnt, _gvn.intcon(1)));
store_to_memory(ctrl, adr_iic_node, incr, T_INT, adr_type, MemNode::unordered);
}
@@ -380,8 +380,8 @@
if (stride != 0) {
Node* str = _gvn.MakeConX(stride);
- Node* scale = _gvn.transform( new (C) MulXNode( idx, str ) );
- ptr = _gvn.transform( new (C) AddPNode( mdo, ptr, scale ) );
+ Node* scale = _gvn.transform( new MulXNode( idx, str ) );
+ ptr = _gvn.transform( new AddPNode( mdo, ptr, scale ) );
}
return ptr;
@@ -393,7 +393,7 @@
const TypePtr* adr_type = _gvn.type(adr_node)->is_ptr();
Node* cnt = make_load(NULL, adr_node, TypeInt::INT, T_INT, adr_type, MemNode::unordered);
- Node* incr = _gvn.transform(new (C) AddINode(cnt, _gvn.intcon(DataLayout::counter_increment)));
+ Node* incr = _gvn.transform(new AddINode(cnt, _gvn.intcon(DataLayout::counter_increment)));
store_to_memory(NULL, adr_node, incr, T_INT, adr_type, MemNode::unordered);
}
@@ -413,7 +413,7 @@
const TypePtr* adr_type = _gvn.type(adr_node)->is_ptr();
Node* flags = make_load(NULL, adr_node, TypeInt::BYTE, T_BYTE, adr_type, MemNode::unordered);
- Node* incr = _gvn.transform(new (C) OrINode(flags, _gvn.intcon(flag_constant)));
+ Node* incr = _gvn.transform(new OrINode(flags, _gvn.intcon(flag_constant)));
store_to_memory(NULL, adr_node, incr, T_BYTE, adr_type, MemNode::unordered);
}
--- a/hotspot/src/share/vm/opto/phaseX.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/phaseX.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -47,7 +47,7 @@
_total_insert_probes(0), _total_inserts(0),
_insert_probes(0), _grows(0) {
// _sentinel must be in the current node space
- _sentinel = new (Compile::current()) ProjNode(NULL, TypeFunc::Control);
+ _sentinel = new ProjNode(NULL, TypeFunc::Control);
memset(_table,0,sizeof(Node*)*_max);
}
@@ -62,7 +62,7 @@
_total_insert_probes(0), _total_inserts(0),
_insert_probes(0), _grows(0) {
// _sentinel must be in the current node space
- _sentinel = new (Compile::current()) ProjNode(NULL, TypeFunc::Control);
+ _sentinel = new ProjNode(NULL, TypeFunc::Control);
memset(_table,0,sizeof(Node*)*_max);
}
@@ -1309,7 +1309,7 @@
}
// Smash all inputs to 'old', isolating him completely
- Node *temp = new (C) Node(1);
+ Node *temp = new Node(1);
temp->init_req(0,nn); // Add a use to nn to prevent him from dying
remove_dead_node( old );
temp->del_req(0); // Yank bogus edge
--- a/hotspot/src/share/vm/opto/reg_split.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/reg_split.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -93,7 +93,7 @@
// Here we assume a trip through memory is required.
w_i_mask = &C->FIRST_STACK_mask();
}
- return new (C) MachSpillCopyNode(spill_type, def, *w_i_mask, *w_o_mask );
+ return new MachSpillCopyNode(spill_type, def, *w_i_mask, *w_o_mask );
}
//------------------------------insert_proj------------------------------------
@@ -663,7 +663,7 @@
// create a new phi node and insert it into the block
// type is taken from left over pointer to a predecessor
assert(n3,"No non-NULL reaching DEF for a Phi");
- phi = new (C) PhiNode(b->head(), n3->bottom_type());
+ phi = new PhiNode(b->head(), n3->bottom_type());
// initialize the Reaches entry for this LRG
Reachblock[slidx] = phi;
@@ -1075,7 +1075,7 @@
// First Split-UP to move value into Register
uint def_ideal = def->ideal_reg();
const RegMask* tmp_rm = Matcher::idealreg2regmask[def_ideal];
- Node *spill = new (C) MachSpillCopyNode(MachSpillCopyNode::MemToReg, def, dmask, *tmp_rm);
+ Node *spill = new MachSpillCopyNode(MachSpillCopyNode::MemToReg, def, dmask, *tmp_rm);
insert_proj( b, insidx, spill, maxlrg );
// Then Split-DOWN as if previous Split was DEF
maxlrg = split_USE(MachSpillCopyNode::RegToMem, spill,b,n,inpidx,maxlrg,false,false, splits,slidx);
@@ -1229,7 +1229,7 @@
if (C->check_node_count(NodeLimitFudgeFactor, out_of_nodes)) { // Check when generating nodes
return 0;
}
- Node *spill = new (C) MachSpillCopyNode(MachSpillCopyNode::MemToReg, use,use_rm,def_rm);
+ Node *spill = new MachSpillCopyNode(MachSpillCopyNode::MemToReg, use,use_rm,def_rm);
n->set_req(copyidx,spill);
n->as_MachSpillCopy()->set_in_RegMask(def_rm);
// Put the spill just before the copy
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/opto/replacednodes.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -0,0 +1,219 @@
+/*
+ * 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.
+ *
+ */
+
+#include "precompiled.hpp"
+#include "opto/cfgnode.hpp"
+#include "opto/phaseX.hpp"
+#include "opto/replacednodes.hpp"
+
+void ReplacedNodes::allocate_if_necessary() {
+ if (_replaced_nodes == NULL) {
+ _replaced_nodes = new GrowableArray<ReplacedNode>();
+ }
+}
+
+bool ReplacedNodes::is_empty() const {
+ return _replaced_nodes == NULL || _replaced_nodes->length() == 0;
+}
+
+bool ReplacedNodes::has_node(const ReplacedNode& r) const {
+ return _replaced_nodes->find(r) != -1;
+}
+
+bool ReplacedNodes::has_target_node(Node* n) const {
+ for (int i = 0; i < _replaced_nodes->length(); i++) {
+ if (_replaced_nodes->at(i).improved() == n) {
+ return true;
+ }
+ }
+ return false;
+}
+
+// Record replaced node if not seen before
+void ReplacedNodes::record(Node* initial, Node* improved) {
+ allocate_if_necessary();
+ ReplacedNode r(initial, improved);
+ if (!has_node(r)) {
+ _replaced_nodes->push(r);
+ }
+}
+
+// Copy replaced nodes from one map to another. idx is used to
+// identify nodes that are too new to be of interest in the target
+// node list.
+void ReplacedNodes::transfer_from(const ReplacedNodes& other, uint idx) {
+ if (other.is_empty()) {
+ return;
+ }
+ allocate_if_necessary();
+ for (int i = 0; i < other._replaced_nodes->length(); i++) {
+ ReplacedNode replaced = other._replaced_nodes->at(i);
+ // Only transfer the nodes that can actually be useful
+ if (!has_node(replaced) && (replaced.initial()->_idx < idx || has_target_node(replaced.initial()))) {
+ _replaced_nodes->push(replaced);
+ }
+ }
+}
+
+void ReplacedNodes::clone() {
+ if (_replaced_nodes != NULL) {
+ GrowableArray<ReplacedNode>* replaced_nodes_clone = new GrowableArray<ReplacedNode>();
+ replaced_nodes_clone->appendAll(_replaced_nodes);
+ _replaced_nodes = replaced_nodes_clone;
+ }
+}
+
+void ReplacedNodes::reset() {
+ if (_replaced_nodes != NULL) {
+ _replaced_nodes->clear();
+ }
+}
+
+// Perfom node replacement (used when returning to caller)
+void ReplacedNodes::apply(Node* n) {
+ if (is_empty()) {
+ return;
+ }
+ for (int i = 0; i < _replaced_nodes->length(); i++) {
+ ReplacedNode replaced = _replaced_nodes->at(i);
+ n->replace_edge(replaced.initial(), replaced.improved());
+ }
+}
+
+static void enqueue_use(Node* n, Node* use, Unique_Node_List& work) {
+ if (use->is_Phi()) {
+ Node* r = use->in(0);
+ assert(r->is_Region(), "Phi should have Region");
+ for (uint i = 1; i < use->req(); i++) {
+ if (use->in(i) == n) {
+ work.push(r->in(i));
+ }
+ }
+ } else {
+ work.push(use);
+ }
+}
+
+// Perfom node replacement following late inlining
+void ReplacedNodes::apply(Compile* C, Node* ctl) {
+ // ctl is the control on exit of the method that was late inlined
+ if (is_empty()) {
+ return;
+ }
+ for (int i = 0; i < _replaced_nodes->length(); i++) {
+ ReplacedNode replaced = _replaced_nodes->at(i);
+ Node* initial = replaced.initial();
+ Node* improved = replaced.improved();
+ assert (ctl != NULL && !ctl->is_top(), "replaced node should have actual control");
+
+ ResourceMark rm;
+ Unique_Node_List work;
+ // Go over all the uses of the node that is considered for replacement...
+ for (DUIterator j = initial->outs(); initial->has_out(j); j++) {
+ Node* use = initial->out(j);
+
+ if (use == improved || use->outcnt() == 0) {
+ continue;
+ }
+ work.clear();
+ enqueue_use(initial, use, work);
+ bool replace = true;
+ // Check that this use is dominated by ctl. Go ahead with the
+ // replacement if it is.
+ while (work.size() != 0 && replace) {
+ Node* n = work.pop();
+ if (use->outcnt() == 0) {
+ continue;
+ }
+ if (n->is_CFG() || (n->in(0) != NULL && !n->in(0)->is_top())) {
+ int depth = 0;
+ Node *m = n;
+ if (!n->is_CFG()) {
+ n = n->in(0);
+ }
+ assert(n->is_CFG(), "should be CFG now");
+ while(n != ctl) {
+ n = IfNode::up_one_dom(n);
+ depth++;
+ // limit search depth
+ if (depth >= 100 || n == NULL) {
+ replace = false;
+ break;
+ }
+ }
+ } else {
+ for (DUIterator k = n->outs(); n->has_out(k); k++) {
+ enqueue_use(n, n->out(k), work);
+ }
+ }
+ }
+ if (replace) {
+ bool is_in_table = C->initial_gvn()->hash_delete(use);
+ int replaced = use->replace_edge(initial, improved);
+ if (is_in_table) {
+ C->initial_gvn()->hash_find_insert(use);
+ }
+ C->record_for_igvn(use);
+
+ assert(replaced > 0, "inconsistent");
+ --j;
+ }
+ }
+ }
+}
+
+void ReplacedNodes::dump(outputStream *st) const {
+ if (!is_empty()) {
+ tty->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);
+ if (i < _replaced_nodes->length()-1) {
+ tty->print(",");
+ }
+ }
+ }
+}
+
+// Merge 2 list of replaced node at a point where control flow paths merge
+void ReplacedNodes::merge_with(const ReplacedNodes& other) {
+ if (is_empty()) {
+ return;
+ }
+ if (other.is_empty()) {
+ reset();
+ return;
+ }
+ int shift = 0;
+ int len = _replaced_nodes->length();
+ for (int i = 0; i < len; i++) {
+ if (!other.has_node(_replaced_nodes->at(i))) {
+ shift++;
+ } else if (shift > 0) {
+ _replaced_nodes->at_put(i-shift, _replaced_nodes->at(i));
+ }
+ }
+ if (shift > 0) {
+ _replaced_nodes->trunc_to(len - shift);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/opto/replacednodes.hpp Wed Jul 05 19:46:31 2017 +0200
@@ -0,0 +1,81 @@
+/*
+ * 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.
+ *
+ */
+
+#ifndef SHARE_VM_OPTO_REPLACEDNODES_HPP
+#define SHARE_VM_OPTO_REPLACEDNODES_HPP
+
+#include "opto/connode.hpp"
+
+// During parsing, when a node is "improved",
+// GraphKit::replace_in_map() is called to update the current map so
+// that the improved node is used from that point
+// on. GraphKit::replace_in_map() doesn't operate on the callers maps
+// and so some optimization opportunities may be lost. The
+// ReplacedNodes class addresses that problem.
+//
+// A ReplacedNodes object is a list of pair of nodes. Every
+// SafePointNode carries a ReplacedNodes object. Every time
+// GraphKit::replace_in_map() is called, a new pair of nodes is pushed
+// on the list of replaced nodes. When control flow paths merge, their
+// replaced nodes are also merged. When parsing exits a method to
+// return to a caller, the replaced nodes on the exit path are used to
+// update the caller's map.
+class ReplacedNodes VALUE_OBJ_CLASS_SPEC {
+ private:
+ class ReplacedNode VALUE_OBJ_CLASS_SPEC {
+ private:
+ Node* _initial;
+ Node* _improved;
+ public:
+ ReplacedNode() : _initial(NULL), _improved(NULL) {}
+ ReplacedNode(Node* initial, Node* improved) : _initial(initial), _improved(improved) {}
+ Node* initial() const { return _initial; }
+ Node* improved() const { return _improved; }
+
+ bool operator==(const ReplacedNode& other) {
+ return _initial == other._initial && _improved == other._improved;
+ }
+ };
+ GrowableArray<ReplacedNode>* _replaced_nodes;
+
+ void allocate_if_necessary();
+ bool has_node(const ReplacedNode& r) const;
+ bool has_target_node(Node* n) const;
+
+ public:
+ ReplacedNodes()
+ : _replaced_nodes(NULL) {}
+
+ void clone();
+ void record(Node* initial, Node* improved);
+ void transfer_from(const ReplacedNodes& other, uint idx);
+ void reset();
+ void apply(Node* n);
+ void merge_with(const ReplacedNodes& other);
+ bool is_empty() const;
+ void dump(outputStream *st) const;
+ void apply(Compile* C, Node* ctl);
+};
+
+#endif // SHARE_VM_OPTO_REPLACEDNODES_HPP
--- a/hotspot/src/share/vm/opto/runtime.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/runtime.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -896,6 +896,50 @@
return TypeFunc::make(domain, range);
}
+/*
+ * void implCompress(byte[] buf, int ofs)
+ */
+const TypeFunc* OptoRuntime::sha_implCompress_Type() {
+ // create input type (domain)
+ int num_args = 2;
+ int argcnt = num_args;
+ const Type** fields = TypeTuple::fields(argcnt);
+ int argp = TypeFunc::Parms;
+ fields[argp++] = TypePtr::NOTNULL; // buf
+ fields[argp++] = TypePtr::NOTNULL; // state
+ assert(argp == TypeFunc::Parms+argcnt, "correct decoding");
+ const TypeTuple* domain = TypeTuple::make(TypeFunc::Parms+argcnt, fields);
+
+ // no result type needed
+ fields = TypeTuple::fields(1);
+ fields[TypeFunc::Parms+0] = NULL; // void
+ const TypeTuple* range = TypeTuple::make(TypeFunc::Parms, fields);
+ return TypeFunc::make(domain, range);
+}
+
+/*
+ * int implCompressMultiBlock(byte[] b, int ofs, int limit)
+ */
+const TypeFunc* OptoRuntime::digestBase_implCompressMB_Type() {
+ // create input type (domain)
+ int num_args = 4;
+ int argcnt = num_args;
+ const Type** fields = TypeTuple::fields(argcnt);
+ int argp = TypeFunc::Parms;
+ fields[argp++] = TypePtr::NOTNULL; // buf
+ fields[argp++] = TypePtr::NOTNULL; // state
+ fields[argp++] = TypeInt::INT; // ofs
+ fields[argp++] = TypeInt::INT; // limit
+ assert(argp == TypeFunc::Parms+argcnt, "correct decoding");
+ const TypeTuple* domain = TypeTuple::make(TypeFunc::Parms+argcnt, fields);
+
+ // returning ofs (int)
+ fields = TypeTuple::fields(1);
+ fields[TypeFunc::Parms+0] = TypeInt::INT; // ofs
+ const TypeTuple* range = TypeTuple::make(TypeFunc::Parms+1, fields);
+ return TypeFunc::make(domain, range);
+}
+
//------------- Interpreter state access for on stack replacement
const TypeFunc* OptoRuntime::osr_end_Type() {
// create input type (domain)
--- a/hotspot/src/share/vm/opto/runtime.hpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/runtime.hpp Wed Jul 05 19:46:31 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,9 @@
static const TypeFunc* aescrypt_block_Type();
static const TypeFunc* cipherBlockChaining_aescrypt_Type();
+ static const TypeFunc* sha_implCompress_Type();
+ static const TypeFunc* digestBase_implCompressMB_Type();
+
static const TypeFunc* updateBytesCRC32_Type();
// leaf on stack replacement interpreter accessor types
--- a/hotspot/src/share/vm/opto/split_if.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/split_if.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -35,7 +35,7 @@
uint wins = 0;
assert( n->is_CFG(), "" );
assert( region->is_Region(), "" );
- Node *r = new (C) RegionNode( region->req() );
+ Node *r = new RegionNode( region->req() );
IdealLoopTree *loop = get_loop( n );
for( uint i = 1; i < region->req(); i++ ) {
Node *x = n->clone();
--- a/hotspot/src/share/vm/opto/stringopts.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/stringopts.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -70,7 +70,7 @@
_multiple(false),
_string_alloc(NULL),
_stringopts(stringopts) {
- _arguments = new (_stringopts->C) Node(1);
+ _arguments = new Node(1);
_arguments->del_req(0);
}
@@ -228,8 +228,8 @@
const TypeFunc* call_type = OptoRuntime::uncommon_trap_Type();
const TypePtr* no_memory_effects = NULL;
Compile* C = _stringopts->C;
- CallStaticJavaNode* call = new (C) CallStaticJavaNode(call_type, call_addr, "uncommon_trap",
- jvms->bci(), no_memory_effects);
+ CallStaticJavaNode* call = new CallStaticJavaNode(call_type, call_addr, "uncommon_trap",
+ jvms->bci(), no_memory_effects);
for (int e = 0; e < TypeFunc::Parms; e++) {
call->init_req(e, uct->in(e));
}
@@ -1127,9 +1127,9 @@
}
Node* PhaseStringOpts::int_stringSize(GraphKit& kit, Node* arg) {
- RegionNode *final_merge = new (C) RegionNode(3);
+ RegionNode *final_merge = new RegionNode(3);
kit.gvn().set_type(final_merge, Type::CONTROL);
- Node* final_size = new (C) PhiNode(final_merge, TypeInt::INT);
+ Node* final_size = new PhiNode(final_merge, TypeInt::INT);
kit.gvn().set_type(final_size, TypeInt::INT);
IfNode* iff = kit.create_and_map_if(kit.control(),
@@ -1146,11 +1146,11 @@
} else {
// int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);
- RegionNode *r = new (C) RegionNode(3);
+ RegionNode *r = new RegionNode(3);
kit.gvn().set_type(r, Type::CONTROL);
- Node *phi = new (C) PhiNode(r, TypeInt::INT);
+ Node *phi = new PhiNode(r, TypeInt::INT);
kit.gvn().set_type(phi, TypeInt::INT);
- Node *size = new (C) PhiNode(r, TypeInt::INT);
+ Node *size = new PhiNode(r, TypeInt::INT);
kit.gvn().set_type(size, TypeInt::INT);
Node* chk = __ CmpI(arg, __ intcon(0));
Node* p = __ Bool(chk, BoolTest::lt);
@@ -1175,11 +1175,11 @@
// Add loop predicate first.
kit.add_predicate();
- RegionNode *loop = new (C) RegionNode(3);
+ RegionNode *loop = new RegionNode(3);
loop->init_req(1, kit.control());
kit.gvn().set_type(loop, Type::CONTROL);
- Node *index = new (C) PhiNode(loop, TypeInt::INT);
+ Node *index = new PhiNode(loop, TypeInt::INT);
index->init_req(1, __ intcon(0));
kit.gvn().set_type(index, TypeInt::INT);
kit.set_control(loop);
@@ -1212,7 +1212,7 @@
}
void PhaseStringOpts::int_getChars(GraphKit& kit, Node* arg, Node* char_array, Node* start, Node* end) {
- RegionNode *final_merge = new (C) RegionNode(4);
+ RegionNode *final_merge = new RegionNode(4);
kit.gvn().set_type(final_merge, Type::CONTROL);
Node *final_mem = PhiNode::make(final_merge, kit.memory(char_adr_idx), Type::MEMORY, TypeAryPtr::CHARS);
kit.gvn().set_type(final_mem, Type::MEMORY);
@@ -1262,11 +1262,11 @@
__ Bool(__ CmpI(arg, __ intcon(0)), BoolTest::lt),
PROB_FAIR, COUNT_UNKNOWN);
- RegionNode *merge = new (C) RegionNode(3);
+ RegionNode *merge = new RegionNode(3);
kit.gvn().set_type(merge, Type::CONTROL);
- i = new (C) PhiNode(merge, TypeInt::INT);
+ i = new PhiNode(merge, TypeInt::INT);
kit.gvn().set_type(i, TypeInt::INT);
- sign = new (C) PhiNode(merge, TypeInt::INT);
+ sign = new PhiNode(merge, TypeInt::INT);
kit.gvn().set_type(sign, TypeInt::INT);
merge->init_req(1, __ IfTrue(iff));
@@ -1295,10 +1295,10 @@
// Add loop predicate first.
kit.add_predicate();
- RegionNode *head = new (C) RegionNode(3);
+ RegionNode *head = new RegionNode(3);
head->init_req(1, kit.control());
kit.gvn().set_type(head, Type::CONTROL);
- Node *i_phi = new (C) PhiNode(head, TypeInt::INT);
+ Node *i_phi = new PhiNode(head, TypeInt::INT);
i_phi->init_req(1, i);
kit.gvn().set_type(i_phi, TypeInt::INT);
charPos = PhiNode::make(head, charPos);
@@ -1420,7 +1420,7 @@
// as a shim for the insertion of the new code.
JVMState* jvms = sc->begin()->jvms()->clone_shallow(C);
uint size = sc->begin()->req();
- SafePointNode* map = new (C) SafePointNode(size, jvms);
+ SafePointNode* map = new SafePointNode(size, jvms);
// copy the control and memory state from the final call into our
// new starting state. This allows any preceeding tests to feed
@@ -1465,12 +1465,12 @@
// Create a region for the overflow checks to merge into.
int args = MAX2(sc->num_arguments(), 1);
- RegionNode* overflow = new (C) RegionNode(args);
+ RegionNode* overflow = new RegionNode(args);
kit.gvn().set_type(overflow, Type::CONTROL);
// Create a hook node to hold onto the individual sizes since they
// are need for the copying phase.
- Node* string_sizes = new (C) Node(args);
+ Node* string_sizes = new Node(args);
Node* length = __ intcon(0);
for (int argi = 0; argi < sc->num_arguments(); argi++) {
@@ -1514,9 +1514,9 @@
} else if (!type->higher_equal(TypeInstPtr::NOTNULL)) {
// s = s != null ? s : "null";
// length = length + (s.count - s.offset);
- RegionNode *r = new (C) RegionNode(3);
+ RegionNode *r = new RegionNode(3);
kit.gvn().set_type(r, Type::CONTROL);
- Node *phi = new (C) PhiNode(r, type);
+ Node *phi = new PhiNode(r, type);
kit.gvn().set_type(phi, phi->bottom_type());
Node* p = __ Bool(__ CmpP(arg, kit.null()), BoolTest::ne);
IfNode* iff = kit.create_and_map_if(kit.control(), p, PROB_MIN, COUNT_UNKNOWN);
--- a/hotspot/src/share/vm/opto/subnode.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/subnode.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -159,7 +159,7 @@
if( t2->base() == Type::Int ){ // Might be bottom or top...
const TypeInt *i = t2->is_int();
if( i->is_con() )
- return new (phase->C) AddINode(in1, phase->intcon(-i->get_con()));
+ return new AddINode(in1, phase->intcon(-i->get_con()));
}
// Convert "(x+c0) - y" into (x-y) + c0"
@@ -168,8 +168,8 @@
if( op1 == Op_AddI && ok_to_convert(in1, in2) ) {
const Type *tadd = phase->type( in1->in(2) );
if( tadd->singleton() && tadd != Type::TOP ) {
- Node *sub2 = phase->transform( new (phase->C) SubINode( in1->in(1), in2 ));
- return new (phase->C) AddINode( sub2, in1->in(2) );
+ Node *sub2 = phase->transform( new SubINode( in1->in(1), in2 ));
+ return new AddINode( sub2, in1->in(2) );
}
}
@@ -181,9 +181,9 @@
Node* in22 = in2->in(2);
const TypeInt* tcon = phase->type(in22)->isa_int();
if (tcon != NULL && tcon->is_con()) {
- Node* sub2 = phase->transform( new (phase->C) SubINode(in1, in21) );
+ Node* sub2 = phase->transform( new SubINode(in1, in21) );
Node* neg_c0 = phase->intcon(- tcon->get_con());
- return new (phase->C) AddINode(sub2, neg_c0);
+ return new AddINode(sub2, neg_c0);
}
}
@@ -201,47 +201,47 @@
// Convert "x - (x+y)" into "-y"
if( op2 == Op_AddI &&
phase->eqv( in1, in2->in(1) ) )
- return new (phase->C) SubINode( phase->intcon(0),in2->in(2));
+ return new SubINode( phase->intcon(0),in2->in(2));
// Convert "(x-y) - x" into "-y"
if( op1 == Op_SubI &&
phase->eqv( in1->in(1), in2 ) )
- return new (phase->C) SubINode( phase->intcon(0),in1->in(2));
+ return new SubINode( phase->intcon(0),in1->in(2));
// Convert "x - (y+x)" into "-y"
if( op2 == Op_AddI &&
phase->eqv( in1, in2->in(2) ) )
- return new (phase->C) SubINode( phase->intcon(0),in2->in(1));
+ return new SubINode( phase->intcon(0),in2->in(1));
// Convert "0 - (x-y)" into "y-x"
if( t1 == TypeInt::ZERO && op2 == Op_SubI )
- return new (phase->C) SubINode( in2->in(2), in2->in(1) );
+ return new SubINode( in2->in(2), in2->in(1) );
// Convert "0 - (x+con)" into "-con-x"
jint con;
if( t1 == TypeInt::ZERO && op2 == Op_AddI &&
(con = in2->in(2)->find_int_con(0)) != 0 )
- return new (phase->C) SubINode( phase->intcon(-con), in2->in(1) );
+ return new SubINode( phase->intcon(-con), in2->in(1) );
// Convert "(X+A) - (X+B)" into "A - B"
if( op1 == Op_AddI && op2 == Op_AddI && in1->in(1) == in2->in(1) )
- return new (phase->C) SubINode( in1->in(2), in2->in(2) );
+ return new SubINode( in1->in(2), in2->in(2) );
// Convert "(A+X) - (B+X)" into "A - B"
if( op1 == Op_AddI && op2 == Op_AddI && in1->in(2) == in2->in(2) )
- return new (phase->C) SubINode( in1->in(1), in2->in(1) );
+ return new SubINode( in1->in(1), in2->in(1) );
// Convert "(A+X) - (X+B)" into "A - B"
if( op1 == Op_AddI && op2 == Op_AddI && in1->in(2) == in2->in(1) )
- return new (phase->C) SubINode( in1->in(1), in2->in(2) );
+ return new SubINode( in1->in(1), in2->in(2) );
// Convert "(X+A) - (B+X)" into "A - B"
if( op1 == Op_AddI && op2 == Op_AddI && in1->in(1) == in2->in(2) )
- return new (phase->C) SubINode( in1->in(2), in2->in(1) );
+ return new SubINode( in1->in(2), in2->in(1) );
// Convert "A-(B-C)" into (A+C)-B", since add is commutative and generally
// nicer to optimize than subtract.
if( op2 == Op_SubI && in2->outcnt() == 1) {
- Node *add1 = phase->transform( new (phase->C) AddINode( in1, in2->in(2) ) );
- return new (phase->C) SubINode( add1, in2->in(1) );
+ Node *add1 = phase->transform( new AddINode( in1, in2->in(2) ) );
+ return new SubINode( add1, in2->in(1) );
}
return NULL;
@@ -288,7 +288,7 @@
// Convert "x-c0" into "x+ -c0".
if( i && // Might be bottom or top...
i->is_con() )
- return new (phase->C) AddLNode(in1, phase->longcon(-i->get_con()));
+ return new AddLNode(in1, phase->longcon(-i->get_con()));
// Convert "(x+c0) - y" into (x-y) + c0"
// Do not collapse (x+c0)-y if "+" is a loop increment or
@@ -297,8 +297,8 @@
Node *in11 = in1->in(1);
const Type *tadd = phase->type( in1->in(2) );
if( tadd->singleton() && tadd != Type::TOP ) {
- Node *sub2 = phase->transform( new (phase->C) SubLNode( in11, in2 ));
- return new (phase->C) AddLNode( sub2, in1->in(2) );
+ Node *sub2 = phase->transform( new SubLNode( in11, in2 ));
+ return new AddLNode( sub2, in1->in(2) );
}
}
@@ -309,9 +309,9 @@
Node* in22 = in2->in(2);
const TypeLong* tcon = phase->type(in22)->isa_long();
if (tcon != NULL && tcon->is_con()) {
- Node* sub2 = phase->transform( new (phase->C) SubLNode(in1, in21) );
+ Node* sub2 = phase->transform( new SubLNode(in1, in21) );
Node* neg_c0 = phase->longcon(- tcon->get_con());
- return new (phase->C) AddLNode(sub2, neg_c0);
+ return new AddLNode(sub2, neg_c0);
}
}
@@ -329,28 +329,28 @@
// Convert "x - (x+y)" into "-y"
if( op2 == Op_AddL &&
phase->eqv( in1, in2->in(1) ) )
- return new (phase->C) SubLNode( phase->makecon(TypeLong::ZERO), in2->in(2));
+ return new SubLNode( phase->makecon(TypeLong::ZERO), in2->in(2));
// Convert "x - (y+x)" into "-y"
if( op2 == Op_AddL &&
phase->eqv( in1, in2->in(2) ) )
- return new (phase->C) SubLNode( phase->makecon(TypeLong::ZERO),in2->in(1));
+ return new SubLNode( phase->makecon(TypeLong::ZERO),in2->in(1));
// Convert "0 - (x-y)" into "y-x"
if( phase->type( in1 ) == TypeLong::ZERO && op2 == Op_SubL )
- return new (phase->C) SubLNode( in2->in(2), in2->in(1) );
+ return new SubLNode( in2->in(2), in2->in(1) );
// Convert "(X+A) - (X+B)" into "A - B"
if( op1 == Op_AddL && op2 == Op_AddL && in1->in(1) == in2->in(1) )
- return new (phase->C) SubLNode( in1->in(2), in2->in(2) );
+ return new SubLNode( in1->in(2), in2->in(2) );
// Convert "(A+X) - (B+X)" into "A - B"
if( op1 == Op_AddL && op2 == Op_AddL && in1->in(2) == in2->in(2) )
- return new (phase->C) SubLNode( in1->in(1), in2->in(1) );
+ return new SubLNode( in1->in(1), in2->in(1) );
// Convert "A-(B-C)" into (A+C)-B"
if( op2 == Op_SubL && in2->outcnt() == 1) {
- Node *add1 = phase->transform( new (phase->C) AddLNode( in1, in2->in(2) ) );
- return new (phase->C) SubLNode( add1, in2->in(1) );
+ Node *add1 = phase->transform( new AddLNode( in1, in2->in(2) ) );
+ return new SubLNode( add1, in2->in(1) );
}
return NULL;
@@ -417,7 +417,7 @@
// Convert "x - (x+y)" into "-y"
if( in(2)->is_Add() &&
phase->eqv(in(1),in(2)->in(1) ) )
- return new (phase->C) SubFNode( phase->makecon(TypeF::ZERO),in(2)->in(2));
+ return new SubFNode( phase->makecon(TypeF::ZERO),in(2)->in(2));
}
// Cannot replace 0.0-X with -X because a 'fsub' bytecode computes
@@ -460,7 +460,7 @@
// Convert "x - (x+y)" into "-y"
if( in(2)->is_Add() &&
phase->eqv(in(1),in(2)->in(1) ) )
- return new (phase->C) SubDNode( phase->makecon(TypeD::ZERO),in(2)->in(2));
+ return new SubDNode( phase->makecon(TypeD::ZERO),in(2)->in(2));
}
// Cannot replace 0.0-X with -X because a 'dsub' bytecode computes
@@ -666,11 +666,11 @@
if (phase->type(in(2))->higher_equal(TypeInt::ZERO)) {
switch (in(1)->Opcode()) {
case Op_CmpL3: // Collapse a CmpL3/CmpI into a CmpL
- return new (phase->C) CmpLNode(in(1)->in(1),in(1)->in(2));
+ return new CmpLNode(in(1)->in(1),in(1)->in(2));
case Op_CmpF3: // Collapse a CmpF3/CmpI into a CmpF
- return new (phase->C) CmpFNode(in(1)->in(1),in(1)->in(2));
+ return new CmpFNode(in(1)->in(1),in(1)->in(2));
case Op_CmpD3: // Collapse a CmpD3/CmpI into a CmpD
- return new (phase->C) CmpDNode(in(1)->in(1),in(1)->in(2));
+ return new CmpDNode(in(1)->in(1),in(1)->in(2));
//case Op_SubI:
// If (x - y) cannot overflow, then ((x - y) <?> 0)
// can be turned into (x <?> y).
@@ -1109,8 +1109,8 @@
new_in2 = tmp;
}
CmpFNode *new_cmp = (Opcode() == Op_CmpD3)
- ? new (phase->C) CmpF3Node( new_in1, new_in2 )
- : new (phase->C) CmpFNode ( new_in1, new_in2 ) ;
+ ? new CmpF3Node( new_in1, new_in2 )
+ : new CmpFNode ( new_in1, new_in2 ) ;
return new_cmp; // Changed to CmpFNode
}
// Testing value required the precision of a double
@@ -1182,9 +1182,9 @@
// Else fall through. The CMove gets in the way of the test.
// It should be the case that make_predicate(bol->as_int_value()) == bol.
}
- Node* cmp = new (C) CmpINode(test_value, phase->intcon(0));
+ Node* cmp = new CmpINode(test_value, phase->intcon(0));
cmp = phase->transform(cmp);
- Node* bol = new (C) BoolNode(cmp, BoolTest::ne);
+ Node* bol = new BoolNode(cmp, BoolTest::ne);
return phase->transform(bol);
}
@@ -1200,7 +1200,7 @@
//----------------------------------negate-------------------------------------
BoolNode* BoolNode::negate(PhaseGVN* phase) {
Compile* C = phase->C;
- return new (C) BoolNode(in(1), _test.negate());
+ return new BoolNode(in(1), _test.negate());
}
@@ -1238,7 +1238,7 @@
// Swap inputs to the clone
cmp->swap_edges(1, 2);
cmp = phase->transform( cmp );
- return new (phase->C) BoolNode( cmp, _test.commute() );
+ return new BoolNode( cmp, _test.commute() );
}
// Change "bool eq/ne (cmp (xor X 1) 0)" into "bool ne/eq (cmp X 0)".
@@ -1255,8 +1255,8 @@
phase->type( j_xor->in(2) ) == TypeInt::ONE &&
(_test._test == BoolTest::eq ||
_test._test == BoolTest::ne) ) {
- Node *ncmp = phase->transform(new (phase->C) CmpINode(j_xor->in(1),cmp2));
- return new (phase->C) BoolNode( ncmp, _test.negate() );
+ Node *ncmp = phase->transform(new CmpINode(j_xor->in(1),cmp2));
+ return new BoolNode( ncmp, _test.negate() );
}
// Change "bool eq/ne (cmp (Conv2B X) 0)" into "bool eq/ne (cmp X 0)".
@@ -1267,10 +1267,10 @@
(_test._test == BoolTest::eq ||
_test._test == BoolTest::ne) ) {
Node *ncmp = phase->transform(phase->type(c2b->in(1))->isa_int()
- ? (Node*)new (phase->C) CmpINode(c2b->in(1),cmp2)
- : (Node*)new (phase->C) CmpPNode(c2b->in(1),phase->makecon(TypePtr::NULL_PTR))
+ ? (Node*)new CmpINode(c2b->in(1),cmp2)
+ : (Node*)new CmpPNode(c2b->in(1),phase->makecon(TypePtr::NULL_PTR))
);
- return new (phase->C) BoolNode( ncmp, _test._test );
+ return new BoolNode( ncmp, _test._test );
}
// Comparing a SubI against a zero is equal to comparing the SubI
@@ -1280,8 +1280,8 @@
(cop == Op_CmpI) &&
(cmp1->Opcode() == Op_SubI) &&
( cmp2_type == TypeInt::ZERO ) ) {
- Node *ncmp = phase->transform( new (phase->C) CmpINode(cmp1->in(1),cmp1->in(2)));
- return new (phase->C) BoolNode( ncmp, _test._test );
+ Node *ncmp = phase->transform( new CmpINode(cmp1->in(1),cmp1->in(2)));
+ return new BoolNode( ncmp, _test._test );
}
// Change (-A vs 0) into (A vs 0) by commuting the test. Disallow in the
@@ -1292,8 +1292,8 @@
cmp2_type == TypeInt::ZERO &&
phase->type( cmp1->in(1) ) == TypeInt::ZERO &&
phase->type( cmp1->in(2) )->higher_equal(TypeInt::SYMINT) ) {
- Node *ncmp = phase->transform( new (phase->C) CmpINode(cmp1->in(2),cmp2));
- return new (phase->C) BoolNode( ncmp, _test.commute() );
+ Node *ncmp = phase->transform( new CmpINode(cmp1->in(2),cmp2));
+ return new BoolNode( ncmp, _test.commute() );
}
// The transformation below is not valid for either signed or unsigned
--- a/hotspot/src/share/vm/opto/superword.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/superword.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -1456,7 +1456,7 @@
if (t == NULL || t->_lo < 0 || t->_hi > (int)mask) {
cnt = ConNode::make(C, TypeInt::make(mask));
_igvn.register_new_node_with_optimizer(cnt);
- cnt = new (C) AndINode(opd, cnt);
+ cnt = new AndINode(opd, cnt);
_igvn.register_new_node_with_optimizer(cnt);
_phase->set_ctrl(cnt, _phase->get_ctrl(opd));
}
@@ -2067,42 +2067,42 @@
if (align_to_ref_p.invar() != NULL) {
// incorporate any extra invariant piece producing (offset +/- invar) >>> log2(elt)
Node* log2_elt = _igvn.intcon(exact_log2(elt_size));
- Node* aref = new (_phase->C) URShiftINode(align_to_ref_p.invar(), log2_elt);
+ Node* aref = new URShiftINode(align_to_ref_p.invar(), log2_elt);
_igvn.register_new_node_with_optimizer(aref);
_phase->set_ctrl(aref, pre_ctrl);
if (align_to_ref_p.negate_invar()) {
- e = new (_phase->C) SubINode(e, aref);
+ e = new SubINode(e, aref);
} else {
- e = new (_phase->C) AddINode(e, aref);
+ e = new AddINode(e, aref);
}
_igvn.register_new_node_with_optimizer(e);
_phase->set_ctrl(e, pre_ctrl);
}
if (vw > ObjectAlignmentInBytes) {
// incorporate base e +/- base && Mask >>> log2(elt)
- Node* xbase = new(_phase->C) CastP2XNode(NULL, align_to_ref_p.base());
+ Node* xbase = new CastP2XNode(NULL, align_to_ref_p.base());
_igvn.register_new_node_with_optimizer(xbase);
#ifdef _LP64
- xbase = new (_phase->C) ConvL2INode(xbase);
+ xbase = new ConvL2INode(xbase);
_igvn.register_new_node_with_optimizer(xbase);
#endif
Node* mask = _igvn.intcon(vw-1);
- Node* masked_xbase = new (_phase->C) AndINode(xbase, mask);
+ Node* masked_xbase = new AndINode(xbase, mask);
_igvn.register_new_node_with_optimizer(masked_xbase);
Node* log2_elt = _igvn.intcon(exact_log2(elt_size));
- Node* bref = new (_phase->C) URShiftINode(masked_xbase, log2_elt);
+ Node* bref = new URShiftINode(masked_xbase, log2_elt);
_igvn.register_new_node_with_optimizer(bref);
_phase->set_ctrl(bref, pre_ctrl);
- e = new (_phase->C) AddINode(e, bref);
+ e = new AddINode(e, bref);
_igvn.register_new_node_with_optimizer(e);
_phase->set_ctrl(e, pre_ctrl);
}
// compute e +/- lim0
if (scale < 0) {
- e = new (_phase->C) SubINode(e, lim0);
+ e = new SubINode(e, lim0);
} else {
- e = new (_phase->C) AddINode(e, lim0);
+ e = new AddINode(e, lim0);
}
_igvn.register_new_node_with_optimizer(e);
_phase->set_ctrl(e, pre_ctrl);
@@ -2110,13 +2110,13 @@
if (stride * scale > 0) {
// compute V - (e +/- lim0)
Node* va = _igvn.intcon(v_align);
- e = new (_phase->C) SubINode(va, e);
+ e = new SubINode(va, e);
_igvn.register_new_node_with_optimizer(e);
_phase->set_ctrl(e, pre_ctrl);
}
// compute N = (exp) % V
Node* va_msk = _igvn.intcon(v_align - 1);
- Node* N = new (_phase->C) AndINode(e, va_msk);
+ Node* N = new AndINode(e, va_msk);
_igvn.register_new_node_with_optimizer(N);
_phase->set_ctrl(N, pre_ctrl);
@@ -2124,15 +2124,15 @@
// lim = lim0 + N
Node* lim;
if (stride < 0) {
- lim = new (_phase->C) SubINode(lim0, N);
+ lim = new SubINode(lim0, N);
} else {
- lim = new (_phase->C) AddINode(lim0, N);
+ lim = new AddINode(lim0, N);
}
_igvn.register_new_node_with_optimizer(lim);
_phase->set_ctrl(lim, pre_ctrl);
Node* constrained =
- (stride > 0) ? (Node*) new (_phase->C) MinINode(lim, orig_limit)
- : (Node*) new (_phase->C) MaxINode(lim, orig_limit);
+ (stride > 0) ? (Node*) new MinINode(lim, orig_limit)
+ : (Node*) new MaxINode(lim, orig_limit);
_igvn.register_new_node_with_optimizer(constrained);
_phase->set_ctrl(constrained, pre_ctrl);
_igvn.hash_delete(pre_opaq);
--- a/hotspot/src/share/vm/opto/vectornode.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/opto/vectornode.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -252,46 +252,46 @@
guarantee(vopc > 0, err_msg_res("Vector for '%s' is not implemented", NodeClassNames[opc]));
switch (vopc) {
- case Op_AddVB: return new (C) AddVBNode(n1, n2, vt);
- case Op_AddVS: return new (C) AddVSNode(n1, n2, vt);
- case Op_AddVI: return new (C) AddVINode(n1, n2, vt);
- case Op_AddVL: return new (C) AddVLNode(n1, n2, vt);
- case Op_AddVF: return new (C) AddVFNode(n1, n2, vt);
- case Op_AddVD: return new (C) AddVDNode(n1, n2, vt);
+ case Op_AddVB: return new AddVBNode(n1, n2, vt);
+ case Op_AddVS: return new AddVSNode(n1, n2, vt);
+ case Op_AddVI: return new AddVINode(n1, n2, vt);
+ case Op_AddVL: return new AddVLNode(n1, n2, vt);
+ case Op_AddVF: return new AddVFNode(n1, n2, vt);
+ case Op_AddVD: return new AddVDNode(n1, n2, vt);
- case Op_SubVB: return new (C) SubVBNode(n1, n2, vt);
- case Op_SubVS: return new (C) SubVSNode(n1, n2, vt);
- case Op_SubVI: return new (C) SubVINode(n1, n2, vt);
- case Op_SubVL: return new (C) SubVLNode(n1, n2, vt);
- case Op_SubVF: return new (C) SubVFNode(n1, n2, vt);
- case Op_SubVD: return new (C) SubVDNode(n1, n2, vt);
+ case Op_SubVB: return new SubVBNode(n1, n2, vt);
+ case Op_SubVS: return new SubVSNode(n1, n2, vt);
+ case Op_SubVI: return new SubVINode(n1, n2, vt);
+ case Op_SubVL: return new SubVLNode(n1, n2, vt);
+ case Op_SubVF: return new SubVFNode(n1, n2, vt);
+ case Op_SubVD: return new SubVDNode(n1, n2, vt);
- case Op_MulVS: return new (C) MulVSNode(n1, n2, vt);
- case Op_MulVI: return new (C) MulVINode(n1, n2, vt);
- case Op_MulVF: return new (C) MulVFNode(n1, n2, vt);
- case Op_MulVD: return new (C) MulVDNode(n1, n2, vt);
+ case Op_MulVS: return new MulVSNode(n1, n2, vt);
+ case Op_MulVI: return new MulVINode(n1, n2, vt);
+ case Op_MulVF: return new MulVFNode(n1, n2, vt);
+ case Op_MulVD: return new MulVDNode(n1, n2, vt);
- case Op_DivVF: return new (C) DivVFNode(n1, n2, vt);
- case Op_DivVD: return new (C) DivVDNode(n1, n2, vt);
+ case Op_DivVF: return new DivVFNode(n1, n2, vt);
+ case Op_DivVD: return new DivVDNode(n1, n2, vt);
- case Op_LShiftVB: return new (C) LShiftVBNode(n1, n2, vt);
- case Op_LShiftVS: return new (C) LShiftVSNode(n1, n2, vt);
- case Op_LShiftVI: return new (C) LShiftVINode(n1, n2, vt);
- case Op_LShiftVL: return new (C) LShiftVLNode(n1, n2, vt);
+ case Op_LShiftVB: return new LShiftVBNode(n1, n2, vt);
+ case Op_LShiftVS: return new LShiftVSNode(n1, n2, vt);
+ case Op_LShiftVI: return new LShiftVINode(n1, n2, vt);
+ case Op_LShiftVL: return new LShiftVLNode(n1, n2, vt);
- case Op_RShiftVB: return new (C) RShiftVBNode(n1, n2, vt);
- case Op_RShiftVS: return new (C) RShiftVSNode(n1, n2, vt);
- case Op_RShiftVI: return new (C) RShiftVINode(n1, n2, vt);
- case Op_RShiftVL: return new (C) RShiftVLNode(n1, n2, vt);
+ case Op_RShiftVB: return new RShiftVBNode(n1, n2, vt);
+ case Op_RShiftVS: return new RShiftVSNode(n1, n2, vt);
+ case Op_RShiftVI: return new RShiftVINode(n1, n2, vt);
+ case Op_RShiftVL: return new RShiftVLNode(n1, n2, vt);
- case Op_URShiftVB: return new (C) URShiftVBNode(n1, n2, vt);
- case Op_URShiftVS: return new (C) URShiftVSNode(n1, n2, vt);
- case Op_URShiftVI: return new (C) URShiftVINode(n1, n2, vt);
- case Op_URShiftVL: return new (C) URShiftVLNode(n1, n2, vt);
+ case Op_URShiftVB: return new URShiftVBNode(n1, n2, vt);
+ case Op_URShiftVS: return new URShiftVSNode(n1, n2, vt);
+ case Op_URShiftVI: return new URShiftVINode(n1, n2, vt);
+ case Op_URShiftVL: return new URShiftVLNode(n1, n2, vt);
- case Op_AndV: return new (C) AndVNode(n1, n2, vt);
- case Op_OrV: return new (C) OrVNode (n1, n2, vt);
- case Op_XorV: return new (C) XorVNode(n1, n2, vt);
+ case Op_AndV: return new AndVNode(n1, n2, vt);
+ case Op_OrV: return new OrVNode (n1, n2, vt);
+ case Op_XorV: return new XorVNode(n1, n2, vt);
}
fatal(err_msg_res("Missed vector creation for '%s'", NodeClassNames[vopc]));
return NULL;
@@ -306,18 +306,18 @@
switch (bt) {
case T_BOOLEAN:
case T_BYTE:
- return new (C) ReplicateBNode(s, vt);
+ return new ReplicateBNode(s, vt);
case T_CHAR:
case T_SHORT:
- return new (C) ReplicateSNode(s, vt);
+ return new ReplicateSNode(s, vt);
case T_INT:
- return new (C) ReplicateINode(s, vt);
+ return new ReplicateINode(s, vt);
case T_LONG:
- return new (C) ReplicateLNode(s, vt);
+ return new ReplicateLNode(s, vt);
case T_FLOAT:
- return new (C) ReplicateFNode(s, vt);
+ return new ReplicateFNode(s, vt);
case T_DOUBLE:
- return new (C) ReplicateDNode(s, vt);
+ return new ReplicateDNode(s, vt);
}
fatal(err_msg_res("Type '%s' is not supported for vectors", type2name(bt)));
return NULL;
@@ -330,12 +330,12 @@
switch (shift->Opcode()) {
case Op_LShiftI:
case Op_LShiftL:
- return new (C) LShiftCntVNode(cnt, vt);
+ return new LShiftCntVNode(cnt, vt);
case Op_RShiftI:
case Op_RShiftL:
case Op_URShiftI:
case Op_URShiftL:
- return new (C) RShiftCntVNode(cnt, vt);
+ return new RShiftCntVNode(cnt, vt);
}
fatal(err_msg_res("Missed vector creation for '%s'", NodeClassNames[shift->Opcode()]));
return NULL;
@@ -347,18 +347,18 @@
switch (bt) {
case T_BOOLEAN:
case T_BYTE:
- return new (C) PackBNode(s, vt);
+ return new PackBNode(s, vt);
case T_CHAR:
case T_SHORT:
- return new (C) PackSNode(s, vt);
+ return new PackSNode(s, vt);
case T_INT:
- return new (C) PackINode(s, vt);
+ return new PackINode(s, vt);
case T_LONG:
- return new (C) PackLNode(s, vt);
+ return new PackLNode(s, vt);
case T_FLOAT:
- return new (C) PackFNode(s, vt);
+ return new PackFNode(s, vt);
case T_DOUBLE:
- return new (C) PackDNode(s, vt);
+ return new PackDNode(s, vt);
}
fatal(err_msg_res("Type '%s' is not supported for vectors", type2name(bt)));
return NULL;
@@ -383,18 +383,18 @@
switch (bt) {
case T_BOOLEAN:
case T_BYTE:
- return new (C) PackSNode(n1, n2, TypeVect::make(T_SHORT, 2));
+ return new PackSNode(n1, n2, TypeVect::make(T_SHORT, 2));
case T_CHAR:
case T_SHORT:
- return new (C) PackINode(n1, n2, TypeVect::make(T_INT, 2));
+ return new PackINode(n1, n2, TypeVect::make(T_INT, 2));
case T_INT:
- return new (C) PackLNode(n1, n2, TypeVect::make(T_LONG, 2));
+ return new PackLNode(n1, n2, TypeVect::make(T_LONG, 2));
case T_LONG:
- return new (C) Pack2LNode(n1, n2, TypeVect::make(T_LONG, 2));
+ return new Pack2LNode(n1, n2, TypeVect::make(T_LONG, 2));
case T_FLOAT:
- return new (C) PackDNode(n1, n2, TypeVect::make(T_DOUBLE, 2));
+ return new PackDNode(n1, n2, TypeVect::make(T_DOUBLE, 2));
case T_DOUBLE:
- return new (C) Pack2DNode(n1, n2, TypeVect::make(T_DOUBLE, 2));
+ return new Pack2DNode(n1, n2, TypeVect::make(T_DOUBLE, 2));
}
fatal(err_msg_res("Type '%s' is not supported for vectors", type2name(bt)));
}
@@ -405,14 +405,14 @@
LoadVectorNode* LoadVectorNode::make(Compile* C, int opc, Node* ctl, Node* mem,
Node* adr, const TypePtr* atyp, uint vlen, BasicType bt) {
const TypeVect* vt = TypeVect::make(bt, vlen);
- return new (C) LoadVectorNode(ctl, mem, adr, atyp, vt);
+ return new LoadVectorNode(ctl, mem, adr, atyp, vt);
}
// Return the vector version of a scalar store node.
StoreVectorNode* StoreVectorNode::make(Compile* C, int opc, Node* ctl, Node* mem,
Node* adr, const TypePtr* atyp, Node* val,
uint vlen) {
- return new (C) StoreVectorNode(ctl, mem, adr, atyp, val);
+ return new StoreVectorNode(ctl, mem, adr, atyp, val);
}
// Extract a scalar element of vector.
@@ -421,21 +421,21 @@
ConINode* pos = ConINode::make(C, (int)position);
switch (bt) {
case T_BOOLEAN:
- return new (C) ExtractUBNode(v, pos);
+ return new ExtractUBNode(v, pos);
case T_BYTE:
- return new (C) ExtractBNode(v, pos);
+ return new ExtractBNode(v, pos);
case T_CHAR:
- return new (C) ExtractCNode(v, pos);
+ return new ExtractCNode(v, pos);
case T_SHORT:
- return new (C) ExtractSNode(v, pos);
+ return new ExtractSNode(v, pos);
case T_INT:
- return new (C) ExtractINode(v, pos);
+ return new ExtractINode(v, pos);
case T_LONG:
- return new (C) ExtractLNode(v, pos);
+ return new ExtractLNode(v, pos);
case T_FLOAT:
- return new (C) ExtractFNode(v, pos);
+ return new ExtractFNode(v, pos);
case T_DOUBLE:
- return new (C) ExtractDNode(v, pos);
+ return new ExtractDNode(v, pos);
}
fatal(err_msg_res("Type '%s' is not supported for vectors", type2name(bt)));
return NULL;
--- a/hotspot/src/share/vm/prims/whitebox.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/prims/whitebox.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -503,6 +503,159 @@
}
WB_END
+template <typename T>
+static bool GetVMFlag(JavaThread* thread, JNIEnv* env, jstring name, T* value, bool (*TAt)(const char*, T*)) {
+ if (name == NULL) {
+ return false;
+ }
+ ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
+ const char* flag_name = env->GetStringUTFChars(name, NULL);
+ bool result = (*TAt)(flag_name, value);
+ env->ReleaseStringUTFChars(name, flag_name);
+ return result;
+}
+
+template <typename T>
+static bool SetVMFlag(JavaThread* thread, JNIEnv* env, jstring name, T* value, bool (*TAtPut)(const char*, T*, Flag::Flags)) {
+ if (name == NULL) {
+ return false;
+ }
+ ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
+ const char* flag_name = env->GetStringUTFChars(name, NULL);
+ bool result = (*TAtPut)(flag_name, value, Flag::INTERNAL);
+ env->ReleaseStringUTFChars(name, flag_name);
+ return result;
+}
+
+template <typename T>
+static jobject box(JavaThread* thread, JNIEnv* env, Symbol* name, Symbol* sig, T value) {
+ ResourceMark rm(thread);
+ jclass clazz = env->FindClass(name->as_C_string());
+ CHECK_JNI_EXCEPTION_(env, NULL);
+ jmethodID methodID = env->GetStaticMethodID(clazz,
+ vmSymbols::valueOf_name()->as_C_string(),
+ sig->as_C_string());
+ CHECK_JNI_EXCEPTION_(env, NULL);
+ jobject result = env->CallStaticObjectMethod(clazz, methodID, value);
+ CHECK_JNI_EXCEPTION_(env, NULL);
+ return result;
+}
+
+static jobject booleanBox(JavaThread* thread, JNIEnv* env, jboolean value) {
+ return box(thread, env, vmSymbols::java_lang_Boolean(), vmSymbols::Boolean_valueOf_signature(), value);
+}
+static jobject integerBox(JavaThread* thread, JNIEnv* env, jint value) {
+ return box(thread, env, vmSymbols::java_lang_Integer(), vmSymbols::Integer_valueOf_signature(), value);
+}
+static jobject longBox(JavaThread* thread, JNIEnv* env, jlong value) {
+ return box(thread, env, vmSymbols::java_lang_Long(), vmSymbols::Long_valueOf_signature(), value);
+}
+/* static jobject floatBox(JavaThread* thread, JNIEnv* env, jfloat value) {
+ return box(thread, env, vmSymbols::java_lang_Float(), vmSymbols::Float_valueOf_signature(), value);
+}*/
+static jobject doubleBox(JavaThread* thread, JNIEnv* env, jdouble value) {
+ return box(thread, env, vmSymbols::java_lang_Double(), vmSymbols::Double_valueOf_signature(), value);
+}
+
+WB_ENTRY(jobject, WB_GetBooleanVMFlag(JNIEnv* env, jobject o, jstring name))
+ bool result;
+ if (GetVMFlag <bool> (thread, env, name, &result, &CommandLineFlags::boolAt)) {
+ ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
+ return booleanBox(thread, env, result);
+ }
+ return NULL;
+WB_END
+
+WB_ENTRY(jobject, WB_GetIntxVMFlag(JNIEnv* env, jobject o, jstring name))
+ intx result;
+ if (GetVMFlag <intx> (thread, env, name, &result, &CommandLineFlags::intxAt)) {
+ ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
+ return longBox(thread, env, result);
+ }
+ return NULL;
+WB_END
+
+WB_ENTRY(jobject, WB_GetUintxVMFlag(JNIEnv* env, jobject o, jstring name))
+ uintx result;
+ if (GetVMFlag <uintx> (thread, env, name, &result, &CommandLineFlags::uintxAt)) {
+ ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
+ return longBox(thread, env, result);
+ }
+ return NULL;
+WB_END
+
+WB_ENTRY(jobject, WB_GetUint64VMFlag(JNIEnv* env, jobject o, jstring name))
+ uint64_t result;
+ if (GetVMFlag <uint64_t> (thread, env, name, &result, &CommandLineFlags::uint64_tAt)) {
+ ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
+ return longBox(thread, env, result);
+ }
+ return NULL;
+WB_END
+
+WB_ENTRY(jobject, WB_GetDoubleVMFlag(JNIEnv* env, jobject o, jstring name))
+ double result;
+ if (GetVMFlag <double> (thread, env, name, &result, &CommandLineFlags::doubleAt)) {
+ ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
+ return doubleBox(thread, env, result);
+ }
+ return NULL;
+WB_END
+
+WB_ENTRY(jstring, WB_GetStringVMFlag(JNIEnv* env, jobject o, jstring name))
+ ccstr ccstrResult;
+ if (GetVMFlag <ccstr> (thread, env, name, &ccstrResult, &CommandLineFlags::ccstrAt)) {
+ ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
+ jstring result = env->NewStringUTF(ccstrResult);
+ CHECK_JNI_EXCEPTION_(env, NULL);
+ return result;
+ }
+ return NULL;
+WB_END
+
+WB_ENTRY(void, WB_SetBooleanVMFlag(JNIEnv* env, jobject o, jstring name, jboolean value))
+ bool result = value == JNI_TRUE ? true : false;
+ SetVMFlag <bool> (thread, env, name, &result, &CommandLineFlags::boolAtPut);
+WB_END
+
+WB_ENTRY(void, WB_SetIntxVMFlag(JNIEnv* env, jobject o, jstring name, jlong value))
+ intx result = value;
+ SetVMFlag <intx> (thread, env, name, &result, &CommandLineFlags::intxAtPut);
+WB_END
+
+WB_ENTRY(void, WB_SetUintxVMFlag(JNIEnv* env, jobject o, jstring name, jlong value))
+ uintx result = value;
+ SetVMFlag <uintx> (thread, env, name, &result, &CommandLineFlags::uintxAtPut);
+WB_END
+
+WB_ENTRY(void, WB_SetUint64VMFlag(JNIEnv* env, jobject o, jstring name, jlong value))
+ uint64_t result = value;
+ SetVMFlag <uint64_t> (thread, env, name, &result, &CommandLineFlags::uint64_tAtPut);
+WB_END
+
+WB_ENTRY(void, WB_SetDoubleVMFlag(JNIEnv* env, jobject o, jstring name, jdouble value))
+ double result = value;
+ SetVMFlag <double> (thread, env, name, &result, &CommandLineFlags::doubleAtPut);
+WB_END
+
+WB_ENTRY(void, WB_SetStringVMFlag(JNIEnv* env, jobject o, jstring name, jstring value))
+ ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
+ const char* ccstrValue = (value == NULL) ? NULL : env->GetStringUTFChars(value, NULL);
+ ccstr ccstrResult = ccstrValue;
+ bool needFree;
+ {
+ ThreadInVMfromNative ttvfn(thread); // back to VM
+ needFree = SetVMFlag <ccstr> (thread, env, name, &ccstrResult, &CommandLineFlags::ccstrAtPut);
+ }
+ if (value != NULL) {
+ env->ReleaseStringUTFChars(value, ccstrValue);
+ }
+ if (needFree) {
+ FREE_C_HEAP_ARRAY(char, ccstrResult, mtInternal);
+ }
+WB_END
+
+
WB_ENTRY(jboolean, WB_IsInStringTable(JNIEnv* env, jobject o, jstring javaString))
ResourceMark rm(THREAD);
int len;
@@ -561,11 +714,7 @@
return result;
}
- clazz = env->FindClass(vmSymbols::java_lang_Integer()->as_C_string());
- CHECK_JNI_EXCEPTION_(env, NULL);
- jmethodID constructor = env->GetMethodID(clazz, vmSymbols::object_initializer_name()->as_C_string(), vmSymbols::int_void_signature()->as_C_string());
- CHECK_JNI_EXCEPTION_(env, NULL);
- jobject obj = env->NewObject(clazz, constructor, code->comp_level());
+ jobject obj = integerBox(thread, env, code->comp_level());
CHECK_JNI_EXCEPTION_(env, NULL);
env->SetObjectArrayElement(result, 0, obj);
@@ -695,7 +844,26 @@
CC"(Ljava/lang/reflect/Executable;II)Z", (void*)&WB_EnqueueMethodForCompilation},
{CC"clearMethodState",
CC"(Ljava/lang/reflect/Executable;)V", (void*)&WB_ClearMethodState},
- {CC"isInStringTable", CC"(Ljava/lang/String;)Z", (void*)&WB_IsInStringTable },
+ {CC"setBooleanVMFlag", CC"(Ljava/lang/String;Z)V",(void*)&WB_SetBooleanVMFlag},
+ {CC"setIntxVMFlag", CC"(Ljava/lang/String;J)V",(void*)&WB_SetIntxVMFlag},
+ {CC"setUintxVMFlag", CC"(Ljava/lang/String;J)V",(void*)&WB_SetUintxVMFlag},
+ {CC"setUint64VMFlag", CC"(Ljava/lang/String;J)V",(void*)&WB_SetUint64VMFlag},
+ {CC"setDoubleVMFlag", CC"(Ljava/lang/String;D)V",(void*)&WB_SetDoubleVMFlag},
+ {CC"setStringVMFlag", CC"(Ljava/lang/String;Ljava/lang/String;)V",
+ (void*)&WB_SetStringVMFlag},
+ {CC"getBooleanVMFlag", CC"(Ljava/lang/String;)Ljava/lang/Boolean;",
+ (void*)&WB_GetBooleanVMFlag},
+ {CC"getIntxVMFlag", CC"(Ljava/lang/String;)Ljava/lang/Long;",
+ (void*)&WB_GetIntxVMFlag},
+ {CC"getUintxVMFlag", CC"(Ljava/lang/String;)Ljava/lang/Long;",
+ (void*)&WB_GetUintxVMFlag},
+ {CC"getUint64VMFlag", CC"(Ljava/lang/String;)Ljava/lang/Long;",
+ (void*)&WB_GetUint64VMFlag},
+ {CC"getDoubleVMFlag", CC"(Ljava/lang/String;)Ljava/lang/Double;",
+ (void*)&WB_GetDoubleVMFlag},
+ {CC"getStringVMFlag", CC"(Ljava/lang/String;)Ljava/lang/String;",
+ (void*)&WB_GetStringVMFlag},
+ {CC"isInStringTable", CC"(Ljava/lang/String;)Z", (void*)&WB_IsInStringTable },
{CC"fullGC", CC"()V", (void*)&WB_FullGC },
{CC"readReservedMemory", CC"()V", (void*)&WB_ReadReservedMemory },
{CC"getCPUFeatures", CC"()Ljava/lang/String;", (void*)&WB_GetCPUFeatures },
--- a/hotspot/src/share/vm/runtime/arguments.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/runtime/arguments.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -2187,6 +2187,10 @@
}
}
+ if (!(UseParallelGC || UseParallelOldGC) && FLAG_IS_DEFAULT(ScavengeBeforeFullGC)) {
+ FLAG_SET_DEFAULT(ScavengeBeforeFullGC, false);
+ }
+
status = status && verify_percentage(GCHeapFreeLimit, "GCHeapFreeLimit");
status = status && verify_percentage(GCTimeLimit, "GCTimeLimit");
if (GCTimeLimit == 100) {
@@ -3834,10 +3838,6 @@
// nothing to use the profiling, turn if off
FLAG_SET_DEFAULT(TypeProfileLevel, 0);
}
- if (UseTypeSpeculation && FLAG_IS_DEFAULT(ReplaceInParentMaps)) {
- // Doing the replace in parent maps helps speculation
- FLAG_SET_DEFAULT(ReplaceInParentMaps, true);
- }
#endif
if (PrintAssembly && FLAG_IS_DEFAULT(DebugNonSafepoints)) {
--- a/hotspot/src/share/vm/runtime/deoptimization.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/runtime/deoptimization.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -1840,6 +1840,7 @@
"speculate_class_check",
"speculate_null_check",
"rtm_state_change",
+ "unstable_if",
"tenured"
};
const char* Deoptimization::_trap_action_name[] = {
--- a/hotspot/src/share/vm/runtime/deoptimization.hpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/runtime/deoptimization.hpp Wed Jul 05 19:46:31 2017 +0200
@@ -62,6 +62,10 @@
Reason_speculate_class_check, // saw unexpected object class from type speculation
Reason_speculate_null_check, // saw unexpected null from type speculation
Reason_rtm_state_change, // rtm state change detected
+ Reason_unstable_if, // a branch predicted always false was taken
+
+ // Reason_tenured is counted separately, add normal counted Reasons above.
+ // Related to MethodData::_trap_hist_limit where Reason_tenured isn't included
Reason_tenured, // age of the code has reached the limit
Reason_LIMIT,
// Note: Keep this enum in sync. with _trap_reason_name.
@@ -319,6 +323,8 @@
return Reason_class_check;
else if (reason == Reason_speculate_null_check)
return Reason_null_check;
+ else if (reason == Reason_unstable_if)
+ return Reason_intrinsic;
else
return Reason_none;
}
--- a/hotspot/src/share/vm/runtime/globals.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/runtime/globals.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -611,7 +611,7 @@
e.commit();
}
-bool CommandLineFlags::boolAt(char* name, size_t len, bool* value) {
+bool CommandLineFlags::boolAt(const char* name, size_t len, bool* value) {
Flag* result = Flag::find_flag(name, len);
if (result == NULL) return false;
if (!result->is_bool()) return false;
@@ -619,7 +619,7 @@
return true;
}
-bool CommandLineFlags::boolAtPut(char* name, size_t len, bool* value, Flag::Flags origin) {
+bool CommandLineFlags::boolAtPut(const char* name, size_t len, bool* value, Flag::Flags origin) {
Flag* result = Flag::find_flag(name, len);
if (result == NULL) return false;
if (!result->is_bool()) return false;
@@ -639,7 +639,7 @@
faddr->set_origin(origin);
}
-bool CommandLineFlags::intxAt(char* name, size_t len, intx* value) {
+bool CommandLineFlags::intxAt(const char* name, size_t len, intx* value) {
Flag* result = Flag::find_flag(name, len);
if (result == NULL) return false;
if (!result->is_intx()) return false;
@@ -647,7 +647,7 @@
return true;
}
-bool CommandLineFlags::intxAtPut(char* name, size_t len, intx* value, Flag::Flags origin) {
+bool CommandLineFlags::intxAtPut(const char* name, size_t len, intx* value, Flag::Flags origin) {
Flag* result = Flag::find_flag(name, len);
if (result == NULL) return false;
if (!result->is_intx()) return false;
@@ -667,7 +667,7 @@
faddr->set_origin(origin);
}
-bool CommandLineFlags::uintxAt(char* name, size_t len, uintx* value) {
+bool CommandLineFlags::uintxAt(const char* name, size_t len, uintx* value) {
Flag* result = Flag::find_flag(name, len);
if (result == NULL) return false;
if (!result->is_uintx()) return false;
@@ -675,7 +675,7 @@
return true;
}
-bool CommandLineFlags::uintxAtPut(char* name, size_t len, uintx* value, Flag::Flags origin) {
+bool CommandLineFlags::uintxAtPut(const char* name, size_t len, uintx* value, Flag::Flags origin) {
Flag* result = Flag::find_flag(name, len);
if (result == NULL) return false;
if (!result->is_uintx()) return false;
@@ -695,7 +695,7 @@
faddr->set_origin(origin);
}
-bool CommandLineFlags::uint64_tAt(char* name, size_t len, uint64_t* value) {
+bool CommandLineFlags::uint64_tAt(const char* name, size_t len, uint64_t* value) {
Flag* result = Flag::find_flag(name, len);
if (result == NULL) return false;
if (!result->is_uint64_t()) return false;
@@ -703,7 +703,7 @@
return true;
}
-bool CommandLineFlags::uint64_tAtPut(char* name, size_t len, uint64_t* value, Flag::Flags origin) {
+bool CommandLineFlags::uint64_tAtPut(const char* name, size_t len, uint64_t* value, Flag::Flags origin) {
Flag* result = Flag::find_flag(name, len);
if (result == NULL) return false;
if (!result->is_uint64_t()) return false;
@@ -723,7 +723,7 @@
faddr->set_origin(origin);
}
-bool CommandLineFlags::doubleAt(char* name, size_t len, double* value) {
+bool CommandLineFlags::doubleAt(const char* name, size_t len, double* value) {
Flag* result = Flag::find_flag(name, len);
if (result == NULL) return false;
if (!result->is_double()) return false;
@@ -731,7 +731,7 @@
return true;
}
-bool CommandLineFlags::doubleAtPut(char* name, size_t len, double* value, Flag::Flags origin) {
+bool CommandLineFlags::doubleAtPut(const char* name, size_t len, double* value, Flag::Flags origin) {
Flag* result = Flag::find_flag(name, len);
if (result == NULL) return false;
if (!result->is_double()) return false;
@@ -751,7 +751,7 @@
faddr->set_origin(origin);
}
-bool CommandLineFlags::ccstrAt(char* name, size_t len, ccstr* value) {
+bool CommandLineFlags::ccstrAt(const char* name, size_t len, ccstr* value) {
Flag* result = Flag::find_flag(name, len);
if (result == NULL) return false;
if (!result->is_ccstr()) return false;
@@ -759,7 +759,7 @@
return true;
}
-bool CommandLineFlags::ccstrAtPut(char* name, size_t len, ccstr* value, Flag::Flags origin) {
+bool CommandLineFlags::ccstrAtPut(const char* name, size_t len, ccstr* value, Flag::Flags origin) {
Flag* result = Flag::find_flag(name, len);
if (result == NULL) return false;
if (!result->is_ccstr()) return false;
--- a/hotspot/src/share/vm/runtime/globals.hpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/runtime/globals.hpp Wed Jul 05 19:46:31 2017 +0200
@@ -362,37 +362,37 @@
class CommandLineFlags {
public:
- static bool boolAt(char* name, size_t len, bool* value);
- static bool boolAt(char* name, bool* value) { return boolAt(name, strlen(name), value); }
- static bool boolAtPut(char* name, size_t len, bool* value, Flag::Flags origin);
- static bool boolAtPut(char* name, bool* value, Flag::Flags origin) { return boolAtPut(name, strlen(name), value, origin); }
+ static bool boolAt(const char* name, size_t len, bool* value);
+ static bool boolAt(const char* name, bool* value) { return boolAt(name, strlen(name), value); }
+ static bool boolAtPut(const char* name, size_t len, bool* value, Flag::Flags origin);
+ static bool boolAtPut(const char* name, bool* value, Flag::Flags origin) { return boolAtPut(name, strlen(name), value, origin); }
- static bool intxAt(char* name, size_t len, intx* value);
- static bool intxAt(char* name, intx* value) { return intxAt(name, strlen(name), value); }
- static bool intxAtPut(char* name, size_t len, intx* value, Flag::Flags origin);
- static bool intxAtPut(char* name, intx* value, Flag::Flags origin) { return intxAtPut(name, strlen(name), value, origin); }
+ static bool intxAt(const char* name, size_t len, intx* value);
+ static bool intxAt(const char* name, intx* value) { return intxAt(name, strlen(name), value); }
+ static bool intxAtPut(const char* name, size_t len, intx* value, Flag::Flags origin);
+ static bool intxAtPut(const char* name, intx* value, Flag::Flags origin) { return intxAtPut(name, strlen(name), value, origin); }
- static bool uintxAt(char* name, size_t len, uintx* value);
- static bool uintxAt(char* name, uintx* value) { return uintxAt(name, strlen(name), value); }
- static bool uintxAtPut(char* name, size_t len, uintx* value, Flag::Flags origin);
- static bool uintxAtPut(char* name, uintx* value, Flag::Flags origin) { return uintxAtPut(name, strlen(name), value, origin); }
+ static bool uintxAt(const char* name, size_t len, uintx* value);
+ static bool uintxAt(const char* name, uintx* value) { return uintxAt(name, strlen(name), value); }
+ static bool uintxAtPut(const char* name, size_t len, uintx* value, Flag::Flags origin);
+ static bool uintxAtPut(const char* name, uintx* value, Flag::Flags origin) { return uintxAtPut(name, strlen(name), value, origin); }
- static bool uint64_tAt(char* name, size_t len, uint64_t* value);
- static bool uint64_tAt(char* name, uint64_t* value) { return uint64_tAt(name, strlen(name), value); }
- static bool uint64_tAtPut(char* name, size_t len, uint64_t* value, Flag::Flags origin);
- static bool uint64_tAtPut(char* name, uint64_t* value, Flag::Flags origin) { return uint64_tAtPut(name, strlen(name), value, origin); }
+ static bool uint64_tAt(const char* name, size_t len, uint64_t* value);
+ static bool uint64_tAt(const char* name, uint64_t* value) { return uint64_tAt(name, strlen(name), value); }
+ static bool uint64_tAtPut(const char* name, size_t len, uint64_t* value, Flag::Flags origin);
+ static bool uint64_tAtPut(const char* name, uint64_t* value, Flag::Flags origin) { return uint64_tAtPut(name, strlen(name), value, origin); }
- static bool doubleAt(char* name, size_t len, double* value);
- static bool doubleAt(char* name, double* value) { return doubleAt(name, strlen(name), value); }
- static bool doubleAtPut(char* name, size_t len, double* value, Flag::Flags origin);
- static bool doubleAtPut(char* name, double* value, Flag::Flags origin) { return doubleAtPut(name, strlen(name), value, origin); }
+ static bool doubleAt(const char* name, size_t len, double* value);
+ static bool doubleAt(const char* name, double* value) { return doubleAt(name, strlen(name), value); }
+ static bool doubleAtPut(const char* name, size_t len, double* value, Flag::Flags origin);
+ static bool doubleAtPut(const char* name, double* value, Flag::Flags origin) { return doubleAtPut(name, strlen(name), value, origin); }
- static bool ccstrAt(char* name, size_t len, ccstr* value);
- static bool ccstrAt(char* name, ccstr* value) { return ccstrAt(name, strlen(name), value); }
+ static bool ccstrAt(const char* name, size_t len, ccstr* value);
+ static bool ccstrAt(const char* name, ccstr* value) { return ccstrAt(name, strlen(name), value); }
// Contract: Flag will make private copy of the incoming value.
// Outgoing value is always malloc-ed, and caller MUST call free.
- static bool ccstrAtPut(char* name, size_t len, ccstr* value, Flag::Flags origin);
- static bool ccstrAtPut(char* name, ccstr* value, Flag::Flags origin) { return ccstrAtPut(name, strlen(name), value, origin); }
+ static bool ccstrAtPut(const char* name, size_t len, ccstr* value, Flag::Flags origin);
+ static bool ccstrAtPut(const char* name, ccstr* value, Flag::Flags origin) { return ccstrAtPut(name, strlen(name), value, origin); }
// Returns false if name is not a command line flag.
static bool wasSetOnCmdline(const char* name, bool* value);
@@ -599,6 +599,9 @@
product(bool, UseAES, false, \
"Control whether AES instructions can be used on x86/x64") \
\
+ product(bool, UseSHA, false, \
+ "Control whether SHA instructions can be used on SPARC") \
+ \
product(uintx, LargePageSizeInBytes, 0, \
"Large page size (0 to let VM choose the page size)") \
\
@@ -705,6 +708,15 @@
product(bool, UseAESIntrinsics, false, \
"Use intrinsics for AES versions of crypto") \
\
+ product(bool, UseSHA1Intrinsics, false, \
+ "Use intrinsics for SHA-1 crypto hash function") \
+ \
+ product(bool, UseSHA256Intrinsics, false, \
+ "Use intrinsics for SHA-224 and SHA-256 crypto hash functions") \
+ \
+ product(bool, UseSHA512Intrinsics, false, \
+ "Use intrinsics for SHA-384 and SHA-512 crypto hash functions") \
+ \
product(bool, UseCRC32Intrinsics, false, \
"use intrinsics for java.util.zip.CRC32") \
\
@@ -1097,7 +1109,7 @@
"Call loadClassInternal() rather than loadClass()") \
\
product_pd(bool, DontYieldALot, \
- "Throw away obvious excess yield calls (for Solaris only)") \
+ "Throw away obvious excess yield calls") \
\
product_pd(bool, ConvertSleepToYield, \
"Convert sleep(0) to thread yield " \
@@ -1105,7 +1117,7 @@
\
product(bool, ConvertYieldToSleep, false, \
"Convert yield to a sleep of MinSleepInterval to simulate Win32 " \
- "behavior (Solaris only)") \
+ "behavior") \
\
product(bool, UseBoundThreads, true, \
"Bind user level threads to kernel threads (for Solaris only)") \
@@ -1143,8 +1155,8 @@
"avoid NPTL-FUTEX hang pthread_cond_timedwait") \
\
product(bool, FilterSpuriousWakeups, true, \
- "Prevent spurious or premature wakeups from object.wait " \
- "(Solaris only)") \
+ "When true prevents OS-level spurious, or premature, wakeups " \
+ "from Object.wait (Ignored for Windows)") \
\
product(intx, NativeMonitorTimeout, -1, "(Unstable)") \
\
@@ -1450,8 +1462,7 @@
"(ParallelGC only)") \
\
product(bool, ScavengeBeforeFullGC, true, \
- "Scavenge youngest generation before each full GC, " \
- "used with UseParallelGC") \
+ "Scavenge youngest generation before each full GC.") \
\
develop(bool, ScavengeWithObjectsInToSpace, false, \
"Allow scavenges to occur when to-space contains objects") \
@@ -2252,9 +2263,6 @@
notproduct(bool, CheckMemoryInitialization, false, \
"Check memory initialization") \
\
- product(bool, CollectGen0First, false, \
- "Collect youngest generation before each full GC") \
- \
diagnostic(bool, BindCMSThreadToCPU, false, \
"Bind CMS Thread to CPU if possible") \
\
@@ -2333,11 +2341,11 @@
NOT_LP64(2200*K) LP64_ONLY(4*M), \
"Initial size of the boot class loader data metaspace") \
\
- product(bool, TraceGen0Time, false, \
- "Trace accumulated time for Gen 0 collection") \
- \
- product(bool, TraceGen1Time, false, \
- "Trace accumulated time for Gen 1 collection") \
+ product(bool, TraceYoungGenTime, false, \
+ "Trace accumulated time for young collection") \
+ \
+ product(bool, TraceOldGenTime, false, \
+ "Trace accumulated time for old collection") \
\
product(bool, PrintTenuringDistribution, false, \
"Print tenuring age information") \
--- a/hotspot/src/share/vm/runtime/stubRoutines.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/runtime/stubRoutines.cpp Wed Jul 05 19:46:31 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
@@ -125,6 +125,13 @@
address StubRoutines::_cipherBlockChaining_encryptAESCrypt = NULL;
address StubRoutines::_cipherBlockChaining_decryptAESCrypt = NULL;
+address StubRoutines::_sha1_implCompress = NULL;
+address StubRoutines::_sha1_implCompressMB = NULL;
+address StubRoutines::_sha256_implCompress = NULL;
+address StubRoutines::_sha256_implCompressMB = NULL;
+address StubRoutines::_sha512_implCompress = NULL;
+address StubRoutines::_sha512_implCompressMB = NULL;
+
address StubRoutines::_updateBytesCRC32 = NULL;
address StubRoutines::_crc_table_adr = NULL;
--- a/hotspot/src/share/vm/runtime/stubRoutines.hpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/runtime/stubRoutines.hpp Wed Jul 05 19:46:31 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
@@ -207,6 +207,13 @@
static address _cipherBlockChaining_encryptAESCrypt;
static address _cipherBlockChaining_decryptAESCrypt;
+ static address _sha1_implCompress;
+ static address _sha1_implCompressMB;
+ static address _sha256_implCompress;
+ static address _sha256_implCompressMB;
+ static address _sha512_implCompress;
+ static address _sha512_implCompressMB;
+
static address _updateBytesCRC32;
static address _crc_table_adr;
@@ -356,6 +363,13 @@
static address cipherBlockChaining_encryptAESCrypt() { return _cipherBlockChaining_encryptAESCrypt; }
static address cipherBlockChaining_decryptAESCrypt() { return _cipherBlockChaining_decryptAESCrypt; }
+ static address sha1_implCompress() { return _sha1_implCompress; }
+ static address sha1_implCompressMB() { return _sha1_implCompressMB; }
+ static address sha256_implCompress() { return _sha256_implCompress; }
+ static address sha256_implCompressMB() { return _sha256_implCompressMB; }
+ static address sha512_implCompress() { return _sha512_implCompress; }
+ static address sha512_implCompressMB() { return _sha512_implCompressMB; }
+
static address updateBytesCRC32() { return _updateBytesCRC32; }
static address crc_table_addr() { return _crc_table_adr; }
--- a/hotspot/src/share/vm/runtime/vframe.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/runtime/vframe.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -274,7 +274,8 @@
// Get oopmap describing oops and int for current bci
InterpreterOopMap oop_mask;
if (TraceDeoptimization && Verbose) {
- methodHandle m_h(thread(), method());
+ // need the current JavaThread and not thread()
+ methodHandle m_h(Thread::current(), method());
OopMapCache::compute_one_oop_map(m_h, bci(), &oop_mask);
} else {
method()->mask_for(bci(), &oop_mask);
@@ -335,7 +336,8 @@
if (!method()->is_native()) {
// Get oopmap describing oops and int for current bci
if (TraceDeoptimization && Verbose) {
- methodHandle m_h(method());
+ // need the current JavaThread and not thread()
+ methodHandle m_h(Thread::current(), method());
OopMapCache::compute_one_oop_map(m_h, bci(), &oop_mask);
} else {
method()->mask_for(bci(), &oop_mask);
--- a/hotspot/src/share/vm/runtime/vmStructs.cpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/runtime/vmStructs.cpp Wed Jul 05 19:46:31 2017 +0200
@@ -2504,6 +2504,7 @@
declare_constant(Deoptimization::Reason_speculate_class_check) \
declare_constant(Deoptimization::Reason_speculate_null_check) \
declare_constant(Deoptimization::Reason_rtm_state_change) \
+ declare_constant(Deoptimization::Reason_unstable_if) \
declare_constant(Deoptimization::Reason_tenured) \
declare_constant(Deoptimization::Reason_LIMIT) \
declare_constant(Deoptimization::Reason_RECORDED_LIMIT) \
--- a/hotspot/src/share/vm/utilities/growableArray.hpp Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/src/share/vm/utilities/growableArray.hpp Wed Jul 05 19:46:31 2017 +0200
@@ -349,6 +349,7 @@
// inserts the given element before the element at index i
void insert_before(const int idx, const E& elem) {
+ assert(0 <= idx && idx <= _len, "illegal index");
check_nesting();
if (_len == _max) grow(_len);
for (int j = _len - 1; j >= idx; j--) {
@@ -360,7 +361,7 @@
void appendAll(const GrowableArray<E>* l) {
for (int i = 0; i < l->_len; i++) {
- raw_at_put_grow(_len, l->_data[i], 0);
+ raw_at_put_grow(_len, l->_data[i], E());
}
}
--- a/hotspot/test/TEST.groups Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/test/TEST.groups Wed Jul 05 19:46:31 2017 +0200
@@ -117,6 +117,7 @@
# Tests that require compact3 API's
#
needs_compact3 = \
+ compiler/8009761/Test8009761.java \
compiler/whitebox/DeoptimizeMethodTest.java \
compiler/whitebox/SetForceInlineMethodTest.java \
compiler/whitebox/SetDontInlineMethodTest.java \
@@ -216,3 +217,111 @@
-:needs_compact3 \
-:needs_jre \
-:needs_jdk
+
+# All tests that explicitly set the G1 GC
+#
+needs_g1gc = \
+ compiler/regalloc/C1ObjectSpillInLogicOp.java \
+ gc/8000311/Test8000311.java \
+ gc/TestG1ZeroPGCTJcmdThreadPrint.java \
+ gc/TestSystemGC.java \
+ gc/arguments/TestAlignmentToUseLargePages.java \
+ gc/arguments/TestG1HeapRegionSize.java \
+ gc/arguments/TestG1HeapSizeFlags.java \
+ gc/arguments/TestMaxHeapSizeTools.java \
+ gc/arguments/TestMaxNewSize.java \
+ gc/arguments/TestUseCompressedOopsErgo.java \
+ gc/g1/ \
+ gc/metaspace/G1AddMetaspaceDependency.java \
+ gc/metaspace/TestMetaspacePerfCounters.java \
+ gc/startup_warnings/TestG1.java
+
+# All tests that explicitly set the serial GC
+#
+needs_serialgc = \
+ gc/TestSystemGC.java \
+ gc/arguments/TestAlignmentToUseLargePages.java \
+ gc/arguments/TestMaxNewSize.java \
+ gc/arguments/TestSerialHeapSizeFlags.java \
+ gc/arguments/TestUseCompressedOopsErgo.java \
+ gc/defnew/HeapChangeLogging.java \
+ gc/metaspace/TestMetaspacePerfCounters.java \
+ gc/metaspace/TestPerfCountersAndMemoryPools.java \
+ gc/startup_warnings/TestSerialGC.java
+
+# All tests that explicitly set the parallel GC
+#
+needs_parallelgc = \
+ gc/TestSystemGC.java \
+ gc/arguments/TestAlignmentToUseLargePages.java \
+ gc/arguments/TestMaxNewSize.java \
+ gc/arguments/TestMinInitialErgonomics.java \
+ gc/arguments/TestUseCompressedOopsErgo.java \
+ gc/metaspace/TestMetaspacePerfCounters.java \
+ gc/parallelScavenge/ \
+ gc/startup_warnings/TestParallelGC.java \
+ gc/startup_warnings/TestParallelScavengeSerialOld.java
+
+# All tests that explicitly set the CMS GC
+#
+needs_cmsgc = \
+ gc/6581734/Test6581734.java \
+ gc/TestSystemGC.java \
+ gc/arguments/TestAlignmentToUseLargePages.java \
+ gc/arguments/TestCMSHeapSizeFlags.java \
+ gc/arguments/TestMaxNewSize.java \
+ gc/arguments/TestUseCompressedOopsErgo.java \
+ gc/concurrentMarkSweep/ \
+ gc/startup_warnings/TestCMS.java \
+ gc/startup_warnings/TestCMSIncrementalMode.java \
+ gc/startup_warnings/TestCMSNoIncrementalMode.java \
+ gc/startup_warnings/TestDefNewCMS.java \
+ gc/startup_warnings/TestParNewCMS.java
+
+# All tests that explicitly set some GC
+#
+needs_gc = \
+ :needs_g1gc \
+ :needs_serialgc \
+ :needs_parallelgc \
+ :needs_cmsgc
+
+# All tests that do not set any GC explicitly
+#
+not_needs_gc = \
+ :jdk \
+ -:needs_gc
+
+# All tests that could be executed with the G1 GC without VM flags conflict
+#
+applicable_g1gc = \
+ :jdk \
+ -:needs_serialgc \
+ -:needs_parallelgc \
+ -:needs_cmsgc
+
+# All tests that could be executed with the serial GC without VM flags conflict
+#
+applicable_serialgc = \
+ :jdk \
+ -:needs_g1gc \
+ -:needs_parallelgc \
+ -:needs_cmsgc
+
+# All tests that could be executed with the parallel GC without VM flags conflict
+#
+applicable_parallelgc = \
+ :jdk \
+ -:needs_g1gc \
+ -:needs_serialgc \
+ -:needs_cmsgc
+
+# All tests that could be executed with the CMS GC without VM flags conflict
+#
+applicable_cmsgc = \
+ :jdk \
+ -:needs_g1gc \
+ -:needs_serialgc \
+ -:needs_parallelgc
+
+
--- a/hotspot/test/compiler/8009761/Test8009761.java Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/test/compiler/8009761/Test8009761.java Wed Jul 05 19:46:31 2017 +0200
@@ -21,19 +21,27 @@
* questions.
*/
+import com.sun.management.HotSpotDiagnosticMXBean;
+import com.sun.management.VMOption;
+import sun.hotspot.WhiteBox;
+import sun.management.ManagementFactoryHelper;
+
+import java.lang.reflect.Method;
+
/*
* @test
* @bug 8009761
+ * @library /testlibrary /testlibrary/whitebox
* @summary Deoptimization on sparc doesn't set Llast_SP correctly in the interpreter frames it creates
- * @run main/othervm -XX:CompileCommand=exclude,Test8009761::m2 -XX:-UseOnStackReplacement -XX:-BackgroundCompilation -Xss256K Test8009761
- *
+ * @build Test8009761
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=exclude,Test8009761::m2 -XX:-UseOnStackReplacement -XX:-BackgroundCompilation -Xss256K Test8009761
*/
-
public class Test8009761 {
- static class UnloadedClass {
- volatile int i;
- }
+ private static final WhiteBox WHITE_BOX = WhiteBox.getWhiteBox();
+ private static int COMP_LEVEL_FULL_OPTIMIZATION = 4;
+ private static Method m3 = null;
static Object m1(boolean deopt) {
// When running interpreted, on sparc, the caller's stack is
@@ -142,9 +150,11 @@
ll508, ll509, ll510, ll511;
if (deopt) {
- UnloadedClass res = new UnloadedClass(); // sufficient to force deopt with c2 but not c1
- res.i = 0; // forces deopt with c1
- return res;
+ // Force deoptimization of m3
+ WHITE_BOX.deoptimizeMethod(m3);
+ if(WHITE_BOX.isMethodCompiled(m3)) {
+ throw new RuntimeException(m3 + " not deoptimized");
+ }
}
return null;
}
@@ -225,6 +235,18 @@
}
static public void main(String[] args) {
+ // Make sure background compilation is disabled
+ if (backgroundCompilationEnabled()) {
+ throw new RuntimeException("Background compilation enabled");
+ }
+
+ try {
+ // Get Method object for m3
+ m3 = Test8009761.class.getDeclaredMethod("m3", boolean.class, boolean.class);
+ } catch (NoSuchMethodException | SecurityException ex) {
+ throw new RuntimeException("Failed to retrieve method m3");
+ }
+
int c1;
// Call m2 from m3 recursively until stack overflow. Count the number of recursive calls.
try {
@@ -232,10 +254,14 @@
} catch(StackOverflowError soe) {
}
c1 = count;
+
// Force the compilation of m3() that will inline m1()
- for (int i = 0; i < 20000; i++) {
- m3(false, false);
+ WHITE_BOX.enqueueMethodForCompilation(m3, COMP_LEVEL_FULL_OPTIMIZATION);
+ // Because background compilation is disabled, method should now be compiled
+ if(!WHITE_BOX.isMethodCompiled(m3)) {
+ throw new RuntimeException(m3 + " not compiled");
}
+
count = 0;
// Force deoptimization of m3() in m1(), then return from m1()
// to m3(), call recursively m2(). If deoptimization correctly
@@ -245,11 +271,26 @@
m3(false, true);
} catch(StackOverflowError soe) {
}
- if (c1 != count) {
- System.out.println("Failed: init recursive calls: " + c1 + ". After deopt " + count);
- System.exit(97);
+ // Allow number of recursive calls to vary by 1
+ if ((c1 < (count - 1)) || (c1 > (count + 1))) {
+ throw new RuntimeException("Failed: init recursive calls: " + c1 + ". After deopt " + count);
} else {
System.out.println("PASSED " + c1);
}
}
+
+ /**
+ * Checks if background compilation (-XX:+BackgroundCompilation) is enabled.
+ * @return True if background compilation is enabled, false otherwise
+ */
+ private static boolean backgroundCompilationEnabled() {
+ HotSpotDiagnosticMXBean diagnostic = ManagementFactoryHelper.getDiagnosticMXBean();
+ VMOption backgroundCompilation;
+ try {
+ backgroundCompilation = diagnostic.getVMOption("BackgroundCompilation");
+ } catch (IllegalArgumentException e) {
+ return false;
+ }
+ return Boolean.valueOf(backgroundCompilation.getValue());
+ }
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/intrinsics/clone/TestObjectClone.java Wed Jul 05 19:46:31 2017 +0200
@@ -0,0 +1,80 @@
+/*
+ * 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 8033626
+ * @summary assert(ex_map->jvms()->same_calls_as(_exceptions->jvms())) failed: all collected exceptions must come from the same place
+ * @library /testlibrary
+ * @run main/othervm -XX:-TieredCompilation -Xbatch -XX:CompileOnly=TestObjectClone::f TestObjectClone
+ */
+import com.oracle.java.testlibrary.Asserts;
+
+public class TestObjectClone implements Cloneable {
+ static class A extends TestObjectClone {}
+ static class B extends TestObjectClone {
+ public B clone() {
+ return (B)TestObjectClone.b;
+ }
+ }
+ static class C extends TestObjectClone {
+ public C clone() {
+ return (C)TestObjectClone.c;
+ }
+ }
+ static class D extends TestObjectClone {
+ public D clone() {
+ return (D)TestObjectClone.d;
+ }
+ }
+ static TestObjectClone a = new A(), b = new B(), c = new C(), d = new D();
+
+ public static Object f(TestObjectClone o) throws CloneNotSupportedException {
+ // Polymorphic call site: >90% Object::clone / <10% other methods
+ return o.clone();
+ }
+
+ public static void main(String[] args) throws Exception {
+ TestObjectClone[] params1 = {a, a, a, a, a, a, a, a, a, a, a,
+ a, a, a, a, a, a, a, a, a, a, a,
+ a, a, a, a, a, a, a, a, a, a, a,
+ b, c, d};
+
+ for (int i = 0; i < 15000; i++) {
+ f(params1[i % params1.length]);
+ }
+
+ Asserts.assertTrue(f(a) != a);
+ Asserts.assertTrue(f(b) == b);
+ Asserts.assertTrue(f(c) == c);
+ Asserts.assertTrue(f(d) == d);
+
+ try {
+ f(null);
+ throw new AssertionError("");
+ } catch (NullPointerException e) { /* expected */ }
+
+ System.out.println("TEST PASSED");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/intrinsics/hashcode/TestHashCode.java Wed Jul 05 19:46:31 2017 +0200
@@ -0,0 +1,73 @@
+/*
+ * 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 8011646
+ * @summary SEGV in compiled code with loop predication
+ * @run main/othervm -XX:-TieredCompilation -XX:CompileOnly=TestHashCode.m1,Object.hashCode TestHashCode
+ *
+ */
+
+public class TestHashCode {
+ static class A {
+ int i;
+ }
+
+ static class B extends A {
+ }
+
+ static boolean crash = false;
+
+ static A m2() {
+ if (crash) {
+ return null;
+ }
+ return new A();
+ }
+
+ static int m1(A aa) {
+ int res = 0;
+ for (int i = 0; i < 10; i++) {
+ A a = m2();
+ int j = a.i;
+ if (aa instanceof B) {
+ }
+ res += a.hashCode();
+ }
+ return res;
+ }
+
+ public static void main(String[] args) {
+ A a = new A();
+ for (int i = 0; i < 20000; i++) {
+ m1(a);
+ }
+ crash = true;
+ try {
+ m1(a);
+ } catch (NullPointerException e) {
+ System.out.println("Test passed");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/intrinsics/sha/TestSHA.java Wed Jul 05 19:46:31 2017 +0200
@@ -0,0 +1,141 @@
+/*
+ * 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 8035968
+ * @summary C2 support for SHA on SPARC
+ *
+ * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-1 TestSHA
+ * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-224 TestSHA
+ * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-256 TestSHA
+ * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-384 TestSHA
+ * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-512 TestSHA
+ *
+ * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-1 -Doffset=1 TestSHA
+ * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-224 -Doffset=1 TestSHA
+ * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-256 -Doffset=1 TestSHA
+ * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-384 -Doffset=1 TestSHA
+ * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-512 -Doffset=1 TestSHA
+ *
+ * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-1 -Dalgorithm2=SHA-256 TestSHA
+ * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-1 -Dalgorithm2=SHA-512 TestSHA
+ * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-256 -Dalgorithm2=SHA-512 TestSHA
+ *
+ * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-1 -Dalgorithm2=MD5 TestSHA
+ * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=MD5 -Dalgorithm2=SHA-1 TestSHA
+ */
+
+import java.security.MessageDigest;
+import java.util.Arrays;
+
+public class TestSHA {
+ private static final int HASH_LEN = 64; /* up to 512-bit */
+ private static final int ALIGN = 8; /* for different data alignments */
+
+ public static void main(String[] args) throws Exception {
+ String provider = System.getProperty("provider", "SUN");
+ String algorithm = System.getProperty("algorithm", "SHA-1");
+ String algorithm2 = System.getProperty("algorithm2", "");
+ int msgSize = Integer.getInteger("msgSize", 1024);
+ int offset = Integer.getInteger("offset", 0) % ALIGN;
+ int iters = (args.length > 0 ? Integer.valueOf(args[0]) : 100000);
+ int warmupIters = (args.length > 1 ? Integer.valueOf(args[1]) : 20000);
+
+ testSHA(provider, algorithm, msgSize, offset, iters, warmupIters);
+
+ if (algorithm2.equals("") == false) {
+ testSHA(provider, algorithm2, msgSize, offset, iters, warmupIters);
+ }
+ }
+
+ static void testSHA(String provider, String algorithm, int msgSize,
+ int offset, int iters, int warmupIters) throws Exception {
+ System.out.println("provider = " + provider);
+ System.out.println("algorithm = " + algorithm);
+ System.out.println("msgSize = " + msgSize + " bytes");
+ System.out.println("offset = " + offset);
+ System.out.println("iters = " + iters);
+
+ byte[] expectedHash = new byte[HASH_LEN];
+ byte[] hash = new byte[HASH_LEN];
+ byte[] data = new byte[msgSize + offset];
+ for (int i = 0; i < (msgSize + offset); i++) {
+ data[i] = (byte)(i & 0xff);
+ }
+
+ try {
+ MessageDigest sha = MessageDigest.getInstance(algorithm, provider);
+
+ /* do once, which doesn't use intrinsics */
+ sha.reset();
+ sha.update(data, offset, msgSize);
+ expectedHash = sha.digest();
+
+ /* warm up */
+ for (int i = 0; i < warmupIters; i++) {
+ sha.reset();
+ sha.update(data, offset, msgSize);
+ hash = sha.digest();
+ }
+
+ /* check result */
+ if (Arrays.equals(hash, expectedHash) == false) {
+ System.out.println("TestSHA Error: ");
+ showArray(expectedHash, "expectedHash");
+ showArray(hash, "computedHash");
+ //System.exit(1);
+ throw new Exception("TestSHA Error");
+ } else {
+ showArray(hash, "hash");
+ }
+
+ /* measure performance */
+ long start = System.nanoTime();
+ for (int i = 0; i < iters; i++) {
+ sha.reset();
+ sha.update(data, offset, msgSize);
+ hash = sha.digest();
+ }
+ long end = System.nanoTime();
+ double total = (double)(end - start)/1e9; /* in seconds */
+ double thruput = (double)msgSize*iters/1e6/total; /* in MB/s */
+ System.out.println("TestSHA runtime = " + total + " seconds");
+ System.out.println("TestSHA throughput = " + thruput + " MB/s");
+ System.out.println();
+ } catch (Exception e) {
+ System.out.println("Exception: " + e);
+ //System.exit(1);
+ throw new Exception(e);
+ }
+ }
+
+ static void showArray(byte b[], String name) {
+ System.out.format("%s [%d]: ", name, b.length);
+ for (int i = 0; i < Math.min(b.length, HASH_LEN); i++) {
+ System.out.format("%02x ", b[i] & 0xff);
+ }
+ System.out.println();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/loopopts/TestLogSum.java Wed Jul 05 19:46:31 2017 +0200
@@ -0,0 +1,111 @@
+/*
+ * 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 8046516
+ * @summary Segmentation fault in JVM (easily reproducible)
+ * @run main/othervm -XX:-TieredCompilation -Xbatch TestLogSum
+ * @author jackkamm@gmail.com
+ */
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+public class TestLogSum {
+ public static void main(String[] args) {
+ double sum;
+
+ for (int i = 0; i < 6; i++) {
+ for (int n = 2; n < 30; n++) {
+ for (int j = 1; j <= n; j++) {
+ for (int k = 1; k <= j; k++) {
+ // System.out.println(computeSum(k, j));
+ sum = computeSum(k, j);
+ }
+ }
+ }
+ }
+ }
+
+ private static Map<List<Integer>, Double> cache = new HashMap<List<Integer>, Double>();
+ public static double computeSum(int x, int y) {
+ List<Integer> key = Arrays.asList(new Integer[] {x, y});
+
+ if (!cache.containsKey(key)) {
+
+ // explicitly creating/updating a double[] array, instead of using the LogSumArray wrapper object, will prevent the error
+ LogSumArray toReturn = new LogSumArray(x);
+
+ // changing loop indices will prevent the error
+ // in particular, for(z=0; z<x-1; z++), and then using z+1 in place of z, will not produce error
+ for (int z = 1; z < x+1; z++) {
+ double logSummand = Math.log(z + x + y);
+ toReturn.addLogSummand(logSummand);
+ }
+
+ // returning the value here without cacheing it will prevent the segfault
+ cache.put(key, toReturn.retrieveLogSum());
+ }
+ return cache.get(key);
+ }
+
+ /*
+ * Given a bunch of logarithms log(X),log(Y),log(Z),...
+ * This class is used to compute the log of the sum, log(X+Y+Z+...)
+ */
+ private static class LogSumArray {
+ private double[] logSummandArray;
+ private int currSize;
+
+ private double maxLogSummand;
+
+ public LogSumArray(int maxEntries) {
+ this.logSummandArray = new double[maxEntries];
+
+ this.currSize = 0;
+ this.maxLogSummand = Double.NEGATIVE_INFINITY;
+ }
+
+ public void addLogSummand(double logSummand) {
+ logSummandArray[currSize] = logSummand;
+ currSize++;
+ // removing this line will prevent the error
+ maxLogSummand = Math.max(maxLogSummand, logSummand);
+ }
+
+ public double retrieveLogSum() {
+ if (maxLogSummand == Double.NEGATIVE_INFINITY) return Double.NEGATIVE_INFINITY;
+
+ assert currSize <= logSummandArray.length;
+
+ double factorSum = 0;
+ for (int i = 0; i < currSize; i++) {
+ factorSum += Math.exp(logSummandArray[i] - maxLogSummand);
+ }
+
+ return Math.log(factorSum) + maxLogSummand;
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/relocations/TestPrintRelocations.java Wed Jul 05 19:46:31 2017 +0200
@@ -0,0 +1,38 @@
+/*
+ * 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 8044538
+ * @summary assert hit while printing relocations for jump table entries
+ * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -Xcomp -XX:+PrintRelocations TestPrintRelocations
+ */
+
+/**
+ * The test compiles all methods (-Xcomp) and prints their relocation
+ * entries (-XX:+PrintRelocations) to make sure the printing works.
+ */
+public class TestPrintRelocations {
+
+ static public void main(String[] args) { }
+}
--- a/hotspot/test/compiler/whitebox/IsMethodCompilableTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/test/compiler/whitebox/IsMethodCompilableTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -28,7 +28,7 @@
* @build IsMethodCompilableTest
* @run main ClassFileInstaller sun.hotspot.WhiteBox
* @run main ClassFileInstaller com.oracle.java.testlibrary.Platform
- * @run main/othervm/timeout=2400 -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:PerMethodRecompilationCutoff=3 -XX:CompileCommand=compileonly,SimpleTestCase$Helper::* IsMethodCompilableTest
+ * @run main/othervm/timeout=2400 -Xbootclasspath/a:. -Xmixed -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:PerMethodRecompilationCutoff=3 -XX:CompileCommand=compileonly,SimpleTestCase$Helper::* IsMethodCompilableTest
* @summary testing of WB::isMethodCompilable()
* @author igor.ignatyev@oracle.com
*/
--- a/hotspot/test/testlibrary/whitebox/sun/hotspot/WhiteBox.java Thu Jun 19 11:22:36 2014 -0700
+++ b/hotspot/test/testlibrary/whitebox/sun/hotspot/WhiteBox.java Wed Jul 05 19:46:31 2017 +0200
@@ -129,7 +129,7 @@
}
public native int getCompileQueueSize(int compLevel);
public native boolean testSetForceInlineMethod(Executable method, boolean value);
- public boolean enqueueMethodForCompilation(Executable method, int compLevel) {
+ public boolean enqueueMethodForCompilation(Executable method, int compLevel) {
return enqueueMethodForCompilation(method, compLevel, -1 /*InvocationEntryBci*/);
}
public native boolean enqueueMethodForCompilation(Executable method, int compLevel, int entry_bci);
@@ -156,4 +156,17 @@
// CPU features
public native String getCPUFeatures();
+ // VM flags
+ public native void setBooleanVMFlag(String name, boolean value);
+ public native void setIntxVMFlag(String name, long value);
+ public native void setUintxVMFlag(String name, long value);
+ public native void setUint64VMFlag(String name, long value);
+ public native void setStringVMFlag(String name, String value);
+ public native void setDoubleVMFlag(String name, double value);
+ public native Boolean getBooleanVMFlag(String name);
+ public native Long getIntxVMFlag(String name);
+ public native Long getUintxVMFlag(String name);
+ public native Long getUint64VMFlag(String name);
+ public native String getStringVMFlag(String name);
+ public native Double getDoubleVMFlag(String name);
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/testlibrary_tests/whitebox/vm_flags/BooleanTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -0,0 +1,87 @@
+/*
+ * 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 BooleanTest
+ * @bug 8028756
+ * @library /testlibrary /testlibrary/whitebox
+ * @build BooleanTest
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ * @run main/othervm/timeout=600 -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI BooleanTest
+ * @summary testing of WB::set/getBooleanVMFlag()
+ * @author igor.ignatyev@oracle.com
+ */
+
+import sun.hotspot.WhiteBox;
+import com.oracle.java.testlibrary.*;
+import sun.management.*;
+import com.sun.management.*;
+
+public class BooleanTest {
+ private static final WhiteBox WHITE_BOX = WhiteBox.getWhiteBox();
+ private static final Boolean[] TESTS = {true, false, true, true, false};
+ private static final String TEST_NAME = "BooleanTest";
+ private static final String FLAG_NAME = "PrintCompilation";
+ private static final String METHOD = TEST_NAME + "::method";
+ private static final String METHOD1 = METHOD + "1";
+ private static final String METHOD2 = METHOD + "2";
+
+ public static void main(String[] args) throws Exception {
+ if (args.length == 0) {
+ VmFlagTest.runTest(FLAG_NAME, TESTS,
+ VmFlagTest.WHITE_BOX::setBooleanVMFlag,
+ VmFlagTest.WHITE_BOX::getBooleanVMFlag);
+ testFunctional(false);
+ testFunctional(true);
+ } else {
+ boolean value = Boolean.valueOf(args[0]);
+ method1();
+ VmFlagTest.WHITE_BOX.setBooleanVMFlag(FLAG_NAME, value);
+ method2();
+ }
+ }
+
+ private static void testFunctional(boolean value) throws Exception {
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
+ "-Xbootclasspath/a:.",
+ "-XX:+UnlockDiagnosticVMOptions",
+ "-XX:+WhiteBoxAPI",
+ "-Xcomp",
+ "-XX:CompileCommand=compileonly," + METHOD + "*",
+ "-XX:" + (value ? "-" : "+") + FLAG_NAME,
+ TEST_NAME,
+ "" + value);
+ OutputAnalyzer out = new OutputAnalyzer(pb.start());
+ if (value) {
+ out.shouldNotContain(METHOD1);
+ out.shouldContain(METHOD2);
+ } else {
+ out.shouldContain(METHOD1);
+ out.shouldNotContain(METHOD2);
+ }
+ }
+
+ private static void method1() { }
+ private static void method2() { }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/testlibrary_tests/whitebox/vm_flags/DoubleTest.java Wed Jul 05 19:46:31 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.
+ */
+
+/*
+ * @test DoubleTest
+ * @bug 8028756
+ * @library /testlibrary /testlibrary/whitebox
+ * @build DoubleTest
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ * @run main/othervm/timeout=600 -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI DoubleTest
+ * @summary testing of WB::set/getDoubleVMFlag()
+ * @author igor.ignatyev@oracle.com
+ */
+
+public class DoubleTest {
+ private static final String FLAG_NAME = null;
+ private static final Double[] TESTS = {0d, -0d, -1d, 1d,
+ Double.MAX_VALUE, Double.MIN_VALUE, Double.NaN,
+ Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY};
+
+ public static void main(String[] args) throws Exception {
+ VmFlagTest.runTest(FLAG_NAME, TESTS,
+ VmFlagTest.WHITE_BOX::setDoubleVMFlag,
+ VmFlagTest.WHITE_BOX::getDoubleVMFlag);
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/testlibrary_tests/whitebox/vm_flags/IntxTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -0,0 +1,46 @@
+/*
+ * 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 IntxTest
+ * @bug 8028756
+ * @library /testlibrary /testlibrary/whitebox
+ * @build IntxTest
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ * @run main/othervm/timeout=600 -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI IntxTest
+ * @summary testing of WB::set/getIntxVMFlag()
+ * @author igor.ignatyev@oracle.com
+ */
+
+public class IntxTest {
+ private static final String FLAG_NAME = "OnStackReplacePercentage";
+ private static final Long[] TESTS = {0L, 100L, -1L,
+ (long) Integer.MAX_VALUE, (long) Integer.MIN_VALUE};
+
+ public static void main(String[] args) throws Exception {
+ VmFlagTest.runTest(FLAG_NAME, TESTS,
+ VmFlagTest.WHITE_BOX::setIntxVMFlag,
+ VmFlagTest.WHITE_BOX::getIntxVMFlag);
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/testlibrary_tests/whitebox/vm_flags/StringTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -0,0 +1,45 @@
+/*
+ * 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 StringTest
+ * @bug 8028756
+ * @library /testlibrary /testlibrary/whitebox
+ * @build StringTest
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ * @run main/othervm/timeout=600 -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI StringTest
+ * @summary testing of WB::set/getStringVMFlag()
+ * @author igor.ignatyev@oracle.com
+ */
+
+public class StringTest {
+ private static final String FLAG_NAME = "CompileOnly";
+ private static final String[] TESTS = {"StringTest::*", ""};
+
+ public static void main(String[] args) throws Exception {
+ VmFlagTest.runTest(FLAG_NAME, TESTS,
+ VmFlagTest.WHITE_BOX::setStringVMFlag,
+ VmFlagTest.WHITE_BOX::getStringVMFlag);
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/testlibrary_tests/whitebox/vm_flags/Uint64Test.java Wed Jul 05 19:46:31 2017 +0200
@@ -0,0 +1,46 @@
+/*
+ * 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 Uint64Test
+ * @bug 8028756
+ * @library /testlibrary /testlibrary/whitebox
+ * @build Uint64Test
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ * @run main/othervm/timeout=600 -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI Uint64Test
+ * @summary testing of WB::set/getUint64VMFlag()
+ * @author igor.ignatyev@oracle.com
+ */
+
+public class Uint64Test {
+ private static final String FLAG_NAME = "MaxRAM";
+ private static final Long[] TESTS = {0L, 100L, (long) Integer.MAX_VALUE,
+ -1L, Long.MAX_VALUE, Long.MIN_VALUE};
+
+ public static void main(String[] args) throws Exception {
+ VmFlagTest.runTest(FLAG_NAME, TESTS,
+ VmFlagTest.WHITE_BOX::setUint64VMFlag,
+ VmFlagTest.WHITE_BOX::getUint64VMFlag);
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/testlibrary_tests/whitebox/vm_flags/UintxTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -0,0 +1,51 @@
+/*
+ * 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 UintxTest
+ * @bug 8028756
+ * @library /testlibrary /testlibrary/whitebox
+ * @build UintxTest
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ * @run main/othervm/timeout=600 -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI UintxTest
+ * @summary testing of WB::set/getUintxVMFlag()
+ * @author igor.ignatyev@oracle.com
+ */
+import com.oracle.java.testlibrary.Platform;
+
+public class UintxTest {
+ private static final String FLAG_NAME = "VerifyGCStartAt";
+ private static final Long[] TESTS = {0L, 100L, (long) Integer.MAX_VALUE,
+ (1L << 32L) - 1L, 1L << 32L};
+ private static final Long[] EXPECTED_64 = TESTS;
+ private static final Long[] EXPECTED_32 = {0L, 100L,
+ (long) Integer.MAX_VALUE, (1L << 32L) - 1L, 0L};
+
+ public static void main(String[] args) throws Exception {
+ VmFlagTest.runTest(FLAG_NAME, TESTS,
+ Platform.is64bit() ? EXPECTED_64 : EXPECTED_32,
+ VmFlagTest.WHITE_BOX::setUintxVMFlag,
+ VmFlagTest.WHITE_BOX::getUintxVMFlag);
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/testlibrary_tests/whitebox/vm_flags/VmFlagTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -0,0 +1,113 @@
+/*
+ * 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.util.Objects;
+import java.util.function.BiConsumer;
+import java.util.function.Function;
+import sun.hotspot.WhiteBox;
+import sun.management.*;
+import com.sun.management.*;
+import com.oracle.java.testlibrary.*;
+
+public final class VmFlagTest<T> {
+ public static final WhiteBox WHITE_BOX = WhiteBox.getWhiteBox();
+
+ private static final String NONEXISTENT_FLAG = "NonexistentFlag";
+ private final String flagName;
+ private final BiConsumer<T, T> test;
+ private final BiConsumer<String, T> set;
+ private final Function<String, T> get;
+
+ protected VmFlagTest(String flagName, BiConsumer<String, T> set,
+ Function<String, T> get, boolean isPositive) {
+ this.flagName = flagName;
+ this.set = set;
+ this.get = get;
+ if (isPositive) {
+ test = this::testPositive;
+ } else {
+ test = this::testNegative;
+ }
+ }
+
+ private void setNewValue(T value) {
+ set.accept(flagName, value);
+ }
+
+ private T getValue() {
+ return get.apply(flagName);
+ }
+
+ protected static <T> void runTest(String existentFlag, T[] tests,
+ BiConsumer<String, T> set, Function<String, T> get) {
+ runTest(existentFlag, tests, tests, set, get);
+ }
+
+ protected static <T> void runTest(String existentFlag, T[] tests,
+ T[] results, BiConsumer<String, T> set, Function<String, T> get) {
+ if (existentFlag != null) {
+ new VmFlagTest(existentFlag, set, get, true).test(tests, results);
+ }
+ new VmFlagTest(NONEXISTENT_FLAG, set, get, false).test(tests, results);
+ }
+
+ public final void test(T[] tests, T[] results) {
+ Asserts.assertEQ(tests.length, results.length, "[TESTBUG] tests.length != results.length");
+ for (int i = 0, n = tests.length ; i < n; ++i) {
+ test.accept(tests[i], results[i]);
+ }
+ }
+
+ protected String getVMOptionAsString() {
+ HotSpotDiagnosticMXBean diagnostic
+ = ManagementFactoryHelper.getDiagnosticMXBean();
+ VMOption tmp;
+ try {
+ tmp = diagnostic.getVMOption(flagName);
+ } catch (IllegalArgumentException e) {
+ tmp = null;
+ }
+ return tmp == null ? null : tmp.getValue();
+ }
+
+ private void testPositive(T value, T expected) {
+ Asserts.assertEQ(getVMOptionAsString(), asString(getValue()));
+ setNewValue(value);
+ String newValue = getVMOptionAsString();
+ Asserts.assertEQ(newValue, asString(expected));
+ Asserts.assertEQ(getVMOptionAsString(), asString(getValue()));
+ }
+
+ private void testNegative(T value, T expected) {
+ String oldValue = getVMOptionAsString();
+ Asserts.assertEQ(oldValue, asString(getValue()));
+ setNewValue(value);
+ String newValue = getVMOptionAsString();
+ Asserts.assertEQ(oldValue, newValue);
+ }
+
+ private String asString(Object value) {
+ return value == null ? null : "" + value;
+ }
+}
+
--- a/jaxp/.hgtags Thu Jun 19 11:22:36 2014 -0700
+++ b/jaxp/.hgtags Wed Jul 05 19:46:31 2017 +0200
@@ -261,3 +261,4 @@
a1461221b05d4620e4d7d1907e2a0282aaedf31c jdk9-b16
6f923fcbe5129eceb9617a9a18dbdd743980e785 jdk9-b17
5afa90c28742d175431be75f9098745510bd2b30 jdk9-b18
+f9c82769a6bc2b219a8f01c24afe5c91039267d7 jdk9-b19
--- a/jdk/.hgtags Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/.hgtags Wed Jul 05 19:46:31 2017 +0200
@@ -261,3 +261,4 @@
ab7d2c565b0de5bee1361d282d4029371327fc9e jdk9-b16
fd8e675f141b9bdb2f46d1ae8251f4ee3a895d64 jdk9-b17
6ad17b31f0d30593392b1e8695b9709dbbd7fb70 jdk9-b18
+27561aede285c25a3e9ed8bf8918234ad3bb81e3 jdk9-b19
--- a/jdk/THIRD_PARTY_README Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/THIRD_PARTY_README Wed Jul 05 19:46:31 2017 +0200
@@ -1471,7 +1471,7 @@
version 2.0.
The NSS libraries are supplied in executable form, built from unmodified
-NSS source code labeled with the "NSS_3.13.1_RTM" release tag.
+NSS source code labeled with the "NSS_3_16_RTM" HG tag.
The NSS source code is available in the OpenJDK source code repository at:
jdk/test/sun/security/pkcs11/nss/src
--- a/jdk/make/CompileDemos.gmk Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/make/CompileDemos.gmk Wed Jul 05 19:46:31 2017 +0200
@@ -1,6 +1,5 @@
-
#
-# Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2011, 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
@@ -320,7 +319,6 @@
endif
$(eval $(call SetupJVMTIDemo,hprof, java_crw_demo, \
- -I$(JDK_TOPDIR)/src/share/npt -I$(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/npt \
$(BUILD_LIBHPROF_AIX_EXTRA_CFLAGS), C, \
-ldl, ws2_32.lib winmm.lib, -lsocket -lnsl, -lpthread, $(BUILD_LIBHPROF_AIX_EXTRA_SRC)))
--- a/jdk/make/CreateJars.gmk Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/make/CreateJars.gmk Wed Jul 05 19:46:31 2017 +0200
@@ -676,15 +676,6 @@
##########################################################################################
-#
-# This is an empty jar (only contains manifest) and fits poorly into framework...
-# create simple rule instead
-#
-$(IMAGES_OUTPUTDIR)/lib/management-agent.jar: $(JDK_TOPDIR)/src/share/classes/sun/management/manifest
- $(JAR) cfm $@ $<
-
-##########################################################################################
-
# This file is imported from hotspot in Import.gmk. Copying it into images/lib so that
# all jars can be found in one place when creating images in Images.gmk. It needs to be
# done here so that clean targets can be simple and accurate.
--- a/jdk/make/lib/CoreLibraries.gmk Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/make/lib/CoreLibraries.gmk Wed Jul 05 19:46:31 2017 +0200
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2011, 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
@@ -526,30 +526,3 @@
BUILD_LIBRARIES += $(JDK_OUTPUTDIR)/objs/libjli_static.a
endif
-
-##########################################################################################
-
-$(eval $(call SetupNativeCompilation,BUILD_LIBNPT, \
- LIBRARY := npt, \
- OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \
- SRC := $(JDK_TOPDIR)/src/share/npt $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/npt, \
- LANG := C, \
- OPTIMIZATION := LOW, \
- CFLAGS := $(CFLAGS_JDKLIB) \
- -I$(JDK_TOPDIR)/src/share/npt \
- -I$(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/npt, \
- MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libnpt/mapfile-vers, \
- LDFLAGS := $(LDFLAGS_JDKLIB) \
- $(call SET_SHARED_LIBRARY_ORIGIN), \
- LDFLAGS_macosx := -liconv, \
- LDFLAGS_SUFFIX_windows := -export:nptInitialize -export:nptTerminate, \
- LDFLAGS_SUFFIX_solaris := -lc, \
- VERSIONINFO_RESOURCE := $(JDK_TOPDIR)/src/windows/resource/version.rc, \
- RC_FLAGS := $(RC_FLAGS) \
- -D "JDK_FNAME=npt.dll" \
- -D "JDK_INTERNAL_NAME=npt" \
- -D "JDK_FTYPE=0x2L", \
- OBJECT_DIR := $(JDK_OUTPUTDIR)/objs/libnpt, \
- DEBUG_SYMBOLS := true))
-
-BUILD_LIBRARIES += $(BUILD_LIBNPT)
--- a/jdk/make/lib/ServiceabilityLibraries.gmk Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/make/lib/ServiceabilityLibraries.gmk Wed Jul 05 19:46:31 2017 +0200
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2011, 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
@@ -147,8 +147,6 @@
CFLAGS := $(CFLAGS_JDKLIB) $(CFLAGS_WARNINGS_ARE_ERRORS) -DJDWP_LOGGING \
-I$(JDK_TOPDIR)/src/share/transport/export \
-I$(JDK_TOPDIR)/src/share/back/export \
- -I$(JDK_TOPDIR)/src/share/npt \
- -I$(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/npt \
-I$(JDK_TOPDIR)/src/share/back \
-I$(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/back \
-I$(JDK_OUTPUTDIR)/gensrc_jdwp_headers, \
@@ -158,6 +156,7 @@
LDFLAGS_SUFFIX_linux := $(LIBDL), \
LDFLAGS_SUFFIX_solaris := $(LIBDL) -lc, \
LDFLAGS_SUFFIX_windows := $(LDFLAGS_JDKLIB_SUFFIX), \
+ LDFLAGS_SUFFIX_macosx := -liconv, \
VERSIONINFO_RESOURCE := $(JDK_TOPDIR)/src/windows/resource/version.rc, \
RC_FLAGS := $(RC_FLAGS) \
-D "JDK_FNAME=jdwp.dll" \
@@ -340,8 +339,6 @@
BUILD_LIBHPROF_SRC := $(JDK_TOPDIR)/src/share/demo/jvmti/hprof $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/demo/jvmti/hprof
BUILD_LIBHPROF_CFLAGS := -I$(JDK_TOPDIR)/src/share/demo/jvmti/hprof \
- -I$(JDK_TOPDIR)/src/share/npt \
- -I$(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/npt \
-I$(JDK_TOPDIR)/src/share/demo/jvmti/java_crw_demo
ifeq ($(OPENJDK_TARGET_OS), aix)
--- a/jdk/make/mapfiles/libnpt/mapfile-vers Thu Jun 19 11:22:36 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-#
-# Copyright (c) 2004, 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.
-#
-
-# Define public interface.
-
-SUNWprivate_1.1 {
- global:
- nptInitialize;
- nptTerminate;
- local:
- *;
-};
--- a/jdk/make/profile-includes.txt Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/make/profile-includes.txt Wed Jul 05 19:46:31 2017 +0200
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+# 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
@@ -127,12 +127,9 @@
$(OPENJDK_TARGET_CPU_LEGACY_LIB)/$(LIBRARY_PREFIX)jsdt.diz \
$(OPENJDK_TARGET_CPU_LEGACY_LIB)/$(LIBRARY_PREFIX)management$(SHARED_LIBRARY_SUFFIX) \
$(OPENJDK_TARGET_CPU_LEGACY_LIB)/$(LIBRARY_PREFIX)management.diz \
- $(OPENJDK_TARGET_CPU_LEGACY_LIB)/$(LIBRARY_PREFIX)npt$(SHARED_LIBRARY_SUFFIX) \
- $(OPENJDK_TARGET_CPU_LEGACY_LIB)/$(LIBRARY_PREFIX)npt.diz \
$(OPENJDK_TARGET_CPU_LEGACY_LIB)/$(LIBRARY_PREFIX)prefs$(SHARED_LIBRARY_SUFFIX) \
$(OPENJDK_TARGET_CPU_LEGACY_LIB)/$(LIBRARY_PREFIX)sctp$(SHARED_LIBRARY_SUFFIX) \
jvm.hprof.txt \
- management-agent.jar \
management/jmxremote.access \
management/jmxremote.password.template \
management/management.properties \
@@ -140,8 +137,7 @@
PROFILE_3_JRE_OTHER_FILES :=
-PROFILE_3_JRE_JAR_FILES := \
- management-agent.jar
+PROFILE_3_JRE_JAR_FILES :=
FULL_JRE_BIN_FILES := \
--- a/jdk/make/src/classes/build/tools/buildmetaindex/BuildMetaIndex.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/make/src/classes/build/tools/buildmetaindex/BuildMetaIndex.java Wed Jul 05 19:46:31 2017 +0200
@@ -53,7 +53,6 @@
com/sun/net/
javax/
com/sun/security/
-# management-agent.jar
! rt.jar
org/w3c/
com/sun/image/
--- a/jdk/src/share/back/debugInit.c Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/back/debugInit.c Wed Jul 05 19:46:31 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2012, 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
@@ -202,8 +202,6 @@
jint jvmtiCompileTimeMajorVersion;
jint jvmtiCompileTimeMinorVersion;
jint jvmtiCompileTimeMicroVersion;
- char *boot_path = NULL;
- char npt_lib[MAXPATHLEN];
/* See if it's already loaded */
if ( gdata!=NULL && gdata->isLoaded==JNI_TRUE ) {
@@ -268,24 +266,6 @@
forceExit(1); /* Kill entire process, no core dump wanted */
}
- JVMTI_FUNC_PTR(gdata->jvmti, GetSystemProperty)
- (gdata->jvmti, (const char *)"sun.boot.library.path",
- &boot_path);
-
- dbgsysBuildLibName(npt_lib, sizeof(npt_lib), boot_path, NPT_LIBNAME);
- /* Npt and Utf function init */
- NPT_INITIALIZE(npt_lib, &(gdata->npt), NPT_VERSION, NULL);
- jvmtiDeallocate(boot_path);
- if (gdata->npt == NULL) {
- ERROR_MESSAGE(("JDWP: unable to initialize NPT library"));
- return JNI_ERR;
- }
- gdata->npt->utf = (gdata->npt->utfInitialize)(NULL);
- if (gdata->npt->utf == NULL) {
- ERROR_MESSAGE(("JDWP: UTF function initialization failed"));
- return JNI_ERR;
- }
-
/* Parse input options */
if (!parseOptions(options)) {
/* No message necessary, should have been printed out already */
@@ -1307,22 +1287,26 @@
if ( error != JVMTI_ERROR_NONE ) {
exit_code = 1;
if ( docoredump ) {
+ LOG_MISC(("Dumping core as requested by command line"));
finish_logging(exit_code);
abort();
}
}
+
if ( msg==NULL ) {
msg = "";
}
LOG_MISC(("Exiting with error %s(%d): %s", jvmtiErrorText(error), error, msg));
- gdata->vmDead = JNI_TRUE;
+ if (gdata != NULL) {
+ gdata->vmDead = JNI_TRUE;
- /* Let's try and cleanup the JVMTI, if we even have one */
- if ( gdata->jvmti != NULL ) {
- /* Dispose of jvmti (gdata->jvmti becomes NULL) */
- disposeEnvironment(gdata->jvmti);
+ /* Let's try and cleanup the JVMTI, if we even have one */
+ if ( gdata->jvmti != NULL ) {
+ /* Dispose of jvmti (gdata->jvmti becomes NULL) */
+ disposeEnvironment(gdata->jvmti);
+ }
}
/* Finish up logging. We reach here if JDWP is doing the exiting. */
--- a/jdk/src/share/back/error_messages.c Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/back/error_messages.c Wed Jul 05 19:46:31 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
@@ -47,6 +47,7 @@
#include <errno.h>
#include "util.h"
+#include "utf_util.h"
#include "proc_md.h"
/* Maximim length of a message */
@@ -70,13 +71,8 @@
len = (int)strlen((char*)utf8buf);
/* Convert to platform encoding (ignore errors, dangerous area) */
- if (gdata->npt != NULL) {
- (void)(gdata->npt->utf8ToPlatform)(gdata->npt->utf,
- utf8buf, len, pbuf, MAX_MESSAGE_LEN);
- } else {
- /* May be called before NPT is initialized so don't fault */
- strncpy(pbuf, (char*)utf8buf, len);
- }
+ (void)utf8ToPlatform(utf8buf, len, pbuf, MAX_MESSAGE_LEN);
+
(void)fprintf(fp, "%s%s%s", prefix, pbuf, suffix);
}
--- a/jdk/src/share/back/inStream.c Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/back/inStream.c Wed Jul 05 19:46:31 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2008, 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
@@ -24,6 +24,7 @@
*/
#include "util.h"
+#include "utf_util.h"
#include "stream.h"
#include "inStream.h"
#include "transport.h"
@@ -379,15 +380,12 @@
string[length] = '\0';
/* This is Standard UTF-8, convert to Modified UTF-8 if necessary */
- new_length = (gdata->npt->utf8sToUtf8mLength)
- (gdata->npt->utf, (jbyte*)string, length);
+ new_length = utf8sToUtf8mLength((jbyte*)string, length);
if ( new_length != length ) {
char *new_string;
new_string = jvmtiAllocate(new_length+1);
- (gdata->npt->utf8sToUtf8m)
- (gdata->npt->utf, (jbyte*)string, length,
- (jbyte*)new_string, new_length);
+ utf8sToUtf8m((jbyte*)string, length, (jbyte*)new_string, new_length);
jvmtiDeallocate(string);
return new_string;
}
--- a/jdk/src/share/back/outStream.c Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/back/outStream.c Wed Jul 05 19:46:31 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
@@ -24,6 +24,7 @@
*/
#include "util.h"
+#include "utf_util.h"
#include "stream.h"
#include "outStream.h"
#include "inStream.h"
@@ -307,8 +308,7 @@
} else {
jint new_length;
- new_length = (gdata->npt->utf8mToUtf8sLength)
- (gdata->npt->utf, (jbyte*)string, length);
+ new_length = utf8mToUtf8sLength((jbyte*)string, length);
if ( new_length == length ) {
(void)outStream_writeInt(stream, length);
error = writeBytes(stream, (jbyte *)string, length);
@@ -316,9 +316,7 @@
char *new_string;
new_string = jvmtiAllocate(new_length+1);
- (gdata->npt->utf8mToUtf8s)
- (gdata->npt->utf, (jbyte*)string, length,
- (jbyte*)new_string, new_length);
+ utf8mToUtf8s((jbyte*)string, length, (jbyte*)new_string, new_length);
(void)outStream_writeInt(stream, new_length);
error = writeBytes(stream, (jbyte *)new_string, new_length);
jvmtiDeallocate(new_string);
--- a/jdk/src/share/back/transport.c Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/back/transport.c Wed Jul 05 19:46:31 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
@@ -24,6 +24,7 @@
*/
#include "util.h"
+#include "utf_util.h"
#include "transport.h"
#include "debugLoop.h"
#include "sys.h"
@@ -65,8 +66,7 @@
len = (int)strlen(msg);
maxlen = len+len/2+2; /* Should allow for plenty of room */
utf8msg = (jbyte*)jvmtiAllocate(maxlen+1);
- (void)(gdata->npt->utf8FromPlatform)(gdata->npt->utf,
- msg, len, utf8msg, maxlen);
+ (void)utf8FromPlatform(msg, len, utf8msg, maxlen);
utf8msg[maxlen] = 0;
}
if (rv == JDWPTRANSPORT_ERROR_NONE) {
@@ -110,8 +110,7 @@
int len;
len = (int)strlen(libdir);
- (void)(gdata->npt->utf8ToPlatform)(gdata->npt->utf,
- (jbyte*)libdir, len, buf, (int)sizeof(buf));
+ (void)utf8ToPlatform((jbyte*)libdir, len, buf, (int)sizeof(buf));
plibdir = buf;
}
@@ -392,8 +391,7 @@
/* Convert commandLine from UTF-8 to platform encoding */
len = (int)strlen(commandLine);
buf = jvmtiAllocate(len*3+3);
- (void)(gdata->npt->utf8ToPlatform)(gdata->npt->utf,
- (jbyte*)commandLine, len, buf, len*3+3);
+ (void)utf8ToPlatform((jbyte*)commandLine, len, buf, len*3+3);
/* Exec commandLine */
rc = dbgsysExec(buf);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/back/utf_util.c Wed Jul 05 19:46:31 2017 +0200
@@ -0,0 +1,540 @@
+/*
+ * 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
+ * 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.
+ */
+
+#include <stdlib.h>
+#include <ctype.h>
+
+#include "jni.h"
+
+#include "utf_util.h"
+
+
+/* Error and assert macros */
+#define UTF_ERROR(m) utfError(__FILE__, __LINE__, m)
+#define UTF_ASSERT(x) ( (x)==0 ? UTF_ERROR("ASSERT ERROR " #x) : (void)0 )
+
+// Platform independed part
+
+static void utfError(char *file, int line, char *message) {
+ (void)fprintf(stderr, "UTF ERROR [\"%s\":%d]: %s\n", file, line, message);
+ abort();
+}
+
+/* Determine length of this Standard UTF-8 in Modified UTF-8.
+ * Validation is done of the basic UTF encoding rules, returns
+ * length (no change) when errors are detected in the UTF encoding.
+ *
+ * Note: Accepts Modified UTF-8 also, no verification on the
+ * correctness of Standard UTF-8 is done. e,g, 0xC080 input is ok.
+ */
+int JNICALL utf8sToUtf8mLength(jbyte *string, int length) {
+ int newLength;
+ int i;
+
+ newLength = 0;
+ for ( i = 0 ; i < length ; i++ ) {
+ unsigned byte;
+
+ byte = (unsigned char)string[i];
+ if ( (byte & 0x80) == 0 ) { /* 1byte encoding */
+ newLength++;
+ if ( byte == 0 ) {
+ newLength++; /* We gain one byte in length on NULL bytes */
+ }
+ } else if ( (byte & 0xE0) == 0xC0 ) { /* 2byte encoding */
+ /* Check encoding of following bytes */
+ if ( (i+1) >= length || (string[i+1] & 0xC0) != 0x80 ) {
+ break; /* Error condition */
+ }
+ i++; /* Skip next byte */
+ newLength += 2;
+ } else if ( (byte & 0xF0) == 0xE0 ) { /* 3byte encoding */
+ /* Check encoding of following bytes */
+ if ( (i+2) >= length || (string[i+1] & 0xC0) != 0x80
+ || (string[i+2] & 0xC0) != 0x80 ) {
+ break; /* Error condition */
+ }
+ i += 2; /* Skip next two bytes */
+ newLength += 3;
+ } else if ( (byte & 0xF8) == 0xF0 ) { /* 4byte encoding */
+ /* Check encoding of following bytes */
+ if ( (i+3) >= length || (string[i+1] & 0xC0) != 0x80
+ || (string[i+2] & 0xC0) != 0x80
+ || (string[i+3] & 0xC0) != 0x80 ) {
+ break; /* Error condition */
+ }
+ i += 3; /* Skip next 3 bytes */
+ newLength += 6; /* 4byte encoding turns into 2 3byte ones */
+ } else {
+ break; /* Error condition */
+ }
+ }
+ if ( i != length ) {
+ /* Error in finding new length, return old length so no conversion */
+ /* FIXUP: ERROR_MESSAGE? */
+ return length;
+ }
+ return newLength;
+}
+
+/* Convert Standard UTF-8 to Modified UTF-8.
+ * Assumes the UTF-8 encoding was validated by utf8mLength() above.
+ *
+ * Note: Accepts Modified UTF-8 also, no verification on the
+ * correctness of Standard UTF-8 is done. e,g, 0xC080 input is ok.
+ */
+void JNICALL utf8sToUtf8m(jbyte *string, int length, jbyte *newString, int newLength) {
+ int i;
+ int j;
+
+ j = 0;
+ for ( i = 0 ; i < length ; i++ ) {
+ unsigned byte1;
+
+ byte1 = (unsigned char)string[i];
+
+ /* NULL bytes and bytes starting with 11110xxx are special */
+ if ( (byte1 & 0x80) == 0 ) { /* 1byte encoding */
+ if ( byte1 == 0 ) {
+ /* Bits out: 11000000 10000000 */
+ newString[j++] = (jbyte)0xC0;
+ newString[j++] = (jbyte)0x80;
+ } else {
+ /* Single byte */
+ newString[j++] = byte1;
+ }
+ } else if ( (byte1 & 0xE0) == 0xC0 ) { /* 2byte encoding */
+ newString[j++] = byte1;
+ newString[j++] = string[++i];
+ } else if ( (byte1 & 0xF0) == 0xE0 ) { /* 3byte encoding */
+ newString[j++] = byte1;
+ newString[j++] = string[++i];
+ newString[j++] = string[++i];
+ } else if ( (byte1 & 0xF8) == 0xF0 ) { /* 4byte encoding */
+ /* Beginning of 4byte encoding, turn into 2 3byte encodings */
+ unsigned byte2, byte3, byte4, u21;
+
+ /* Bits in: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */
+ byte2 = (unsigned char)string[++i];
+ byte3 = (unsigned char)string[++i];
+ byte4 = (unsigned char)string[++i];
+ /* Reconstruct full 21bit value */
+ u21 = (byte1 & 0x07) << 18;
+ u21 += (byte2 & 0x3F) << 12;
+ u21 += (byte3 & 0x3F) << 6;
+ u21 += (byte4 & 0x3F);
+ /* Bits out: 11101101 1010xxxx 10xxxxxx */
+ newString[j++] = (jbyte)0xED;
+ newString[j++] = (jbyte)(0xA0 + (((u21 >> 16) - 1) & 0x0F));
+ newString[j++] = (jbyte)(0x80 + ((u21 >> 10) & 0x3F));
+ /* Bits out: 11101101 1011xxxx 10xxxxxx */
+ newString[j++] = (jbyte)0xED;
+ newString[j++] = (jbyte)(0xB0 + ((u21 >> 6) & 0x0F));
+ newString[j++] = byte4;
+ }
+ }
+ UTF_ASSERT(i==length);
+ UTF_ASSERT(j==newLength);
+ newString[j] = (jbyte)0;
+}
+
+/* Given a Modified UTF-8 string, calculate the Standard UTF-8 length.
+ * Basic validation of the UTF encoding rules is done, and length is
+ * returned (no change) when errors are detected.
+ *
+ * Note: No validation is made that this is indeed Modified UTF-8 coming in.
+ *
+ */
+int JNICALL utf8mToUtf8sLength(jbyte *string, int length) {
+ int newLength;
+ int i;
+
+ newLength = 0;
+ for ( i = 0 ; i < length ; i++ ) {
+ unsigned byte1, byte2, byte3, byte4, byte5, byte6;
+
+ byte1 = (unsigned char)string[i];
+ if ( (byte1 & 0x80) == 0 ) { /* 1byte encoding */
+ newLength++;
+ } else if ( (byte1 & 0xE0) == 0xC0 ) { /* 2byte encoding */
+ /* Check encoding of following bytes */
+ if ( (i+1) >= length || (string[i+1] & 0xC0) != 0x80 ) {
+ break; /* Error condition */
+ }
+ byte2 = (unsigned char)string[++i];
+ if ( byte1 != 0xC0 || byte2 != 0x80 ) {
+ newLength += 2; /* Normal 2byte encoding, not 0xC080 */
+ } else {
+ newLength++; /* We will turn 0xC080 into 0 */
+ }
+ } else if ( (byte1 & 0xF0) == 0xE0 ) { /* 3byte encoding */
+ /* Check encoding of following bytes */
+ if ( (i+2) >= length || (string[i+1] & 0xC0) != 0x80
+ || (string[i+2] & 0xC0) != 0x80 ) {
+ break; /* Error condition */
+ }
+ byte2 = (unsigned char)string[++i];
+ byte3 = (unsigned char)string[++i];
+ newLength += 3;
+ /* Possible process a second 3byte encoding */
+ if ( (i+3) < length && byte1 == 0xED && (byte2 & 0xF0) == 0xA0 ) {
+ /* See if this is a pair of 3byte encodings */
+ byte4 = (unsigned char)string[i+1];
+ byte5 = (unsigned char)string[i+2];
+ byte6 = (unsigned char)string[i+3];
+ if ( byte4 == 0xED && (byte5 & 0xF0) == 0xB0 ) {
+ /* Check encoding of 3rd byte */
+ if ( (byte6 & 0xC0) != 0x80 ) {
+ break; /* Error condition */
+ }
+ newLength++; /* New string will have 4byte encoding */
+ i += 3; /* Skip next 3 bytes */
+ }
+ }
+ } else {
+ break; /* Error condition */
+ }
+ }
+ if ( i != length ) {
+ /* Error in UTF encoding */
+ /* FIXUP: ERROR_MESSAGE()? */
+ return length;
+ }
+ return newLength;
+}
+
+/* Convert a Modified UTF-8 string into a Standard UTF-8 string
+ * It is assumed that this string has been validated in terms of the
+ * basic UTF encoding rules by utf8Length() above.
+ *
+ * Note: No validation is made that this is indeed Modified UTF-8 coming in.
+ *
+ */
+void JNICALL utf8mToUtf8s(jbyte *string, int length, jbyte *newString, int newLength) {
+ int i;
+ int j;
+
+ j = 0;
+ for ( i = 0 ; i < length ; i++ ) {
+ unsigned byte1, byte2, byte3, byte4, byte5, byte6;
+
+ byte1 = (unsigned char)string[i];
+ if ( (byte1 & 0x80) == 0 ) { /* 1byte encoding */
+ /* Single byte */
+ newString[j++] = byte1;
+ } else if ( (byte1 & 0xE0) == 0xC0 ) { /* 2byte encoding */
+ byte2 = (unsigned char)string[++i];
+ if ( byte1 != 0xC0 || byte2 != 0x80 ) {
+ newString[j++] = byte1;
+ newString[j++] = byte2;
+ } else {
+ newString[j++] = 0;
+ }
+ } else if ( (byte1 & 0xF0) == 0xE0 ) { /* 3byte encoding */
+ byte2 = (unsigned char)string[++i];
+ byte3 = (unsigned char)string[++i];
+ if ( i+3 < length && byte1 == 0xED && (byte2 & 0xF0) == 0xA0 ) {
+ /* See if this is a pair of 3byte encodings */
+ byte4 = (unsigned char)string[i+1];
+ byte5 = (unsigned char)string[i+2];
+ byte6 = (unsigned char)string[i+3];
+ if ( byte4 == 0xED && (byte5 & 0xF0) == 0xB0 ) {
+ unsigned u21;
+
+ /* Bits in: 11101101 1010xxxx 10xxxxxx */
+ /* Bits in: 11101101 1011xxxx 10xxxxxx */
+ i += 3;
+
+ /* Reconstruct 21 bit code */
+ u21 = ((byte2 & 0x0F) + 1) << 16;
+ u21 += (byte3 & 0x3F) << 10;
+ u21 += (byte5 & 0x0F) << 6;
+ u21 += (byte6 & 0x3F);
+
+ /* Bits out: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */
+
+ /* Convert to 4byte encoding */
+ newString[j++] = 0xF0 + ((u21 >> 18) & 0x07);
+ newString[j++] = 0x80 + ((u21 >> 12) & 0x3F);
+ newString[j++] = 0x80 + ((u21 >> 6) & 0x3F);
+ newString[j++] = 0x80 + (u21 & 0x3F);
+ continue;
+ }
+ }
+ /* Normal 3byte encoding */
+ newString[j++] = byte1;
+ newString[j++] = byte2;
+ newString[j++] = byte3;
+ }
+ }
+ UTF_ASSERT(i==length);
+ UTF_ASSERT(j==newLength);
+ newString[j] = 0;
+}
+
+#ifdef _WIN32
+// Microsoft Windows specific part
+
+#include <windows.h>
+
+static UINT getCodepage() {
+ LANGID langID;
+ LCID localeID;
+ TCHAR strCodePage[7]; // ANSI code page id
+
+ static UINT intCodePage = -1;
+
+ if (intCodePage == -1) {
+ // Firts call, get codepage from the os
+ langID = LANGIDFROMLCID(GetUserDefaultLCID());
+ localeID = MAKELCID(langID, SORT_DEFAULT);
+ if (GetLocaleInfo(localeID, LOCALE_IDEFAULTANSICODEPAGE,
+ strCodePage, sizeof(strCodePage)/sizeof(TCHAR)) > 0 ) {
+ intCodePage = atoi(strCodePage);
+ }
+ else {
+ intCodePage = GetACP();
+ }
+ }
+
+ return intCodePage;
+}
+
+/*
+ * Get wide string (assumes len>0)
+ */
+static WCHAR* getWideString(UINT codePage, char* str, int len, int *pwlen) {
+ int wlen;
+ WCHAR* wstr;
+
+ /* Convert the string to WIDE string */
+ wlen = MultiByteToWideChar(codePage, 0, str, len, NULL, 0);
+ *pwlen = wlen;
+ if (wlen <= 0) {
+ UTF_ERROR(("Can't get WIDE string length"));
+ return NULL;
+ }
+ wstr = (WCHAR*)malloc(wlen * sizeof(WCHAR));
+ if (wstr == NULL) {
+ UTF_ERROR(("Can't malloc() any space"));
+ return NULL;
+ }
+ if (MultiByteToWideChar(codePage, 0, str, len, wstr, wlen) == 0) {
+ UTF_ERROR(("Can't get WIDE string"));
+ return NULL;
+ }
+ return wstr;
+}
+
+/*
+ * Convert UTF-8 to a platform string
+ */
+int JNICALL utf8ToPlatform(jbyte *utf8, int len, char* output, int outputMaxLen) {
+ int wlen;
+ int plen;
+ WCHAR* wstr;
+ UINT codepage;
+
+ UTF_ASSERT(utf8);
+ UTF_ASSERT(output);
+ UTF_ASSERT(outputMaxLen > len);
+
+ /* Zero length is ok, but we don't need to do much */
+ if ( len == 0 ) {
+ output[0] = 0;
+ return 0;
+ }
+
+ /* Get WIDE string version (assumes len>0) */
+ wstr = getWideString(CP_UTF8, (char*)utf8, len, &wlen);
+ if ( wstr == NULL ) {
+ // Can't allocate WIDE string
+ goto just_copy_bytes;
+ }
+
+ /* Convert WIDE string to MultiByte string */
+ codepage = getCodepage();
+ plen = WideCharToMultiByte(codepage, 0, wstr, wlen,
+ output, outputMaxLen, NULL, NULL);
+ free(wstr);
+ if (plen <= 0) {
+ // Can't convert WIDE string to multi-byte
+ goto just_copy_bytes;
+ }
+ output[plen] = '\0';
+ return plen;
+
+just_copy_bytes:
+ (void)memcpy(output, utf8, len);
+ output[len] = 0;
+ return len;
+}
+
+/*
+ * Convert Platform Encoding to UTF-8.
+ */
+int JNICALL utf8FromPlatform(char *str, int len, jbyte *output, int outputMaxLen) {
+ int wlen;
+ int plen;
+ WCHAR* wstr;
+ UINT codepage;
+
+ UTF_ASSERT(str);
+ UTF_ASSERT(output);
+ UTF_ASSERT(outputMaxLen > len);
+
+ /* Zero length is ok, but we don't need to do much */
+ if ( len == 0 ) {
+ output[0] = 0;
+ return 0;
+ }
+
+ /* Get WIDE string version (assumes len>0) */
+ codepage = getCodepage();
+ wstr = getWideString(codepage, str, len, &wlen);
+ if ( wstr == NULL ) {
+ goto just_copy_bytes;
+ }
+
+ /* Convert WIDE string to UTF-8 string */
+ plen = WideCharToMultiByte(CP_UTF8, 0, wstr, wlen,
+ (char*)output, outputMaxLen, NULL, NULL);
+ free(wstr);
+ if (plen <= 0) {
+ UTF_ERROR(("Can't convert WIDE string to multi-byte"));
+ goto just_copy_bytes;
+ }
+ output[plen] = '\0';
+ return plen;
+
+just_copy_bytes:
+ (void)memcpy(output, str, len);
+ output[len] = 0;
+ return len;
+}
+
+
+#else
+// *NIX specific part
+
+#include <iconv.h>
+#include <locale.h>
+#include <langinfo.h>
+#include <string.h>
+
+typedef enum {TO_UTF8, FROM_UTF8} conv_direction;
+
+/*
+ * Do iconv() conversion.
+ * Returns length or -1 if output overflows.
+ */
+static int iconvConvert(conv_direction drn, char *bytes, size_t len, char *output, size_t outputMaxLen) {
+
+ static char *codeset = 0;
+ iconv_t func;
+ size_t bytes_converted;
+ size_t inLeft, outLeft;
+ char *inbuf, *outbuf;
+
+ UTF_ASSERT(bytes);
+ UTF_ASSERT(output);
+ UTF_ASSERT(outputMaxLen > len);
+
+ /* Zero length is ok, but we don't need to do much */
+ if ( len == 0 ) {
+ output[0] = 0;
+ return 0;
+ }
+
+ if (codeset == NULL && codeset != (char *) -1) {
+ // locale is not initialized, do it now
+ if (setlocale(LC_ALL, "") != NULL) {
+ // nl_langinfo returns ANSI_X3.4-1968 by default
+ codeset = (char*)nl_langinfo(CODESET);
+ }
+
+ if (codeset == NULL) {
+ // Not able to intialize process locale from platform one.
+ codeset = (char *) -1;
+ }
+ }
+
+ if (codeset == (char *) -1) {
+ // There was an error during initialization, so just bail out
+ goto just_copy_bytes;
+ }
+
+ func = (drn == TO_UTF8) ? iconv_open(codeset, "UTF-8") : iconv_open("UTF-8", codeset);
+ if (func == (iconv_t) -1) {
+ // Requested charset combination is not supported, conversion couldn't be done.
+ // make sure we will not try it again
+ codeset = (char *) -1;
+ goto just_copy_bytes;
+ }
+
+ // perform conversion
+ inbuf = bytes;
+ outbuf = output;
+ inLeft = len;
+ outLeft = outputMaxLen;
+
+ bytes_converted = iconv(func, (void*)&inbuf, &inLeft, &outbuf, &outLeft);
+ if (bytes_converted == (size_t) -1 || bytes_converted == 0 || inLeft != 0) {
+ // Input string is invalid, not able to convert entire string
+ // or some other iconv error happens.
+ iconv_close(func);
+ goto just_copy_bytes;
+ }
+
+ iconv_close(func);
+ // Overwrite bytes_converted with value of actually stored bytes
+ bytes_converted = outputMaxLen-outLeft;
+ output[bytes_converted] = 0;
+ return bytes_converted;
+
+
+just_copy_bytes:
+ (void)memcpy(output, bytes, len);
+ output[len] = 0;
+ return len;
+ }
+
+/*
+ * Convert UTF-8 to Platform Encoding.
+ * Returns length or -1 if output overflows.
+ */
+int JNICALL utf8ToPlatform(jbyte *utf8, int len, char *output, int outputMaxLen) {
+ return iconvConvert(FROM_UTF8, (char*)utf8, len, output, outputMaxLen);
+}
+
+/*
+ * Convert Platform Encoding to UTF-8.
+ * Returns length or -1 if output overflows.
+ */
+int JNICALL utf8FromPlatform(char *str, int len, jbyte *output, int outputMaxLen) {
+ return iconvConvert(TO_UTF8, str, len, (char*) output, outputMaxLen);
+}
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/back/utf_util.h Wed Jul 05 19:46:31 2017 +0200
@@ -0,0 +1,40 @@
+/*
+ * 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
+ * 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.
+ */
+
+#ifndef _utf_util_h_
+#define _utf_util_h_
+
+#include "jni.h"
+
+
+int JNICALL utf8sToUtf8mLength(jbyte *string, int length);
+void JNICALL utf8sToUtf8m(jbyte *string, int length, jbyte *newString, int newLength);
+int JNICALL utf8mToUtf8sLength(jbyte *string, int length);
+void JNICALL utf8mToUtf8s(jbyte *string, int length, jbyte *newString, int newLength);
+
+int JNICALL utf8ToPlatform(jbyte *utf8, int len, char* output, int outputMaxLen);
+int JNICALL utf8FromPlatform(char *str, int len, jbyte *output, int outputMaxLen);
+
+#endif
--- a/jdk/src/share/back/util.h Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/back/util.h Wed Jul 05 19:46:31 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2005, 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
@@ -53,9 +53,6 @@
#include "error_messages.h"
#include "debugInit.h"
-/* Get access to Native Platform Toolkit functions */
-#include "npt.h"
-
/* Definition of a CommonRef tracked by the backend for the frontend */
typedef struct RefNode {
jlong seqNum; /* ID of reference, also key for hash table */
@@ -123,9 +120,6 @@
unsigned log_flags;
- /* The Native Platform Toolkit access */
- NptEnv *npt;
-
/* Common References static data */
jrawMonitorID refLock;
jlong nextSeqNum;
--- a/jdk/src/share/classes/com/sun/imageio/plugins/gif/GIFImageReader.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/imageio/plugins/gif/GIFImageReader.java Wed Jul 05 19:46:31 2017 +0200
@@ -509,7 +509,7 @@
byte[] signature = new byte[6];
stream.readFully(signature);
- StringBuffer version = new StringBuffer(3);
+ StringBuilder version = new StringBuilder(3);
version.append((char)signature[3]);
version.append((char)signature[4]);
version.append((char)signature[5]);
--- a/jdk/src/share/classes/com/sun/imageio/plugins/png/PNGMetadata.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/imageio/plugins/png/PNGMetadata.java Wed Jul 05 19:46:31 2017 +0200
@@ -900,7 +900,7 @@
if (times == 1) {
return s;
}
- StringBuffer sb = new StringBuffer((s.length() + 1)*times - 1);
+ StringBuilder sb = new StringBuilder((s.length() + 1)*times - 1);
sb.append(s);
for (int i = 1; i < times; i++) {
sb.append(" ");
--- a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKFileChooserUI.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKFileChooserUI.java Wed Jul 05 19:46:31 2017 +0200
@@ -169,23 +169,23 @@
result.add(typedInName);
}
- StringBuffer buf = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
len = result.size();
// construct the resulting string
for (int i=0; i<len; i++) {
if (i > 0) {
- buf.append(" ");
+ sb.append(" ");
}
if (len > 1) {
- buf.append("\"");
+ sb.append("\"");
}
- buf.append(result.get(i));
+ sb.append(result.get(i));
if (len > 1) {
- buf.append("\"");
+ sb.append("\"");
}
}
- return buf.toString();
+ return sb.toString();
}
public void setFileName(String fileName) {
--- a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/Metacity.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/Metacity.java Wed Jul 05 19:46:31 2017 +0200
@@ -533,13 +533,13 @@
// Pending: verify character encoding spec for gconf
Reader reader = new InputStreamReader(url.openStream(), "ISO-8859-1");
char[] buf = new char[1024];
- StringBuffer strBuf = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
int n;
while ((n = reader.read(buf)) >= 0) {
- strBuf.append(buf, 0, n);
+ sb.append(buf, 0, n);
}
reader.close();
- String str = strBuf.toString();
+ String str = sb.toString();
if (str != null) {
String strLowerCase = str.toLowerCase();
int i = strLowerCase.indexOf("<entry name=\"theme\"");
--- a/jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifFileChooserUI.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifFileChooserUI.java Wed Jul 05 19:46:31 2017 +0200
@@ -121,20 +121,20 @@
}
private String fileNameString(File[] files) {
- StringBuffer buf = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
for (int i = 0; files != null && i < files.length; i++) {
if (i > 0) {
- buf.append(" ");
+ sb.append(" ");
}
if (files.length > 1) {
- buf.append("\"");
+ sb.append("\"");
}
- buf.append(fileNameString(files[i]));
+ sb.append(fileNameString(files[i]));
if (files.length > 1) {
- buf.append("\"");
+ sb.append("\"");
}
}
- return buf.toString();
+ return sb.toString();
}
public MotifFileChooserUI(JFileChooser filechooser) {
--- a/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java Wed Jul 05 19:46:31 2017 +0200
@@ -690,7 +690,7 @@
}
private String fileNameString(File[] files) {
- StringBuffer buf = new StringBuffer();
+ StringBuilder buf = new StringBuilder();
for (int i = 0; files != null && i < files.length; i++) {
if (i > 0) {
buf.append(" ");
--- a/jdk/src/share/classes/com/sun/java/util/jar/pack/BandStructure.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/java/util/jar/pack/BandStructure.java Wed Jul 05 19:46:31 2017 +0200
@@ -628,7 +628,7 @@
}
if (metaCoding.length > 0
&& (verbose > 2 || verbose > 1 && metaCoding.length > 1)) {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
for (int i = 0; i < metaCoding.length; i++) {
if (i == 1) sb.append(" /");
sb.append(" ").append(metaCoding[i] & 0xFF);
@@ -756,7 +756,7 @@
" size="+outputSize()+
irr+" coding="+bandCoding);
if (metaCoding != noMetaCoding) {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
for (int i = 0; i < metaCoding.length; i++) {
if (i == 1) sb.append(" /");
sb.append(" ").append(metaCoding[i] & 0xFF);
--- a/jdk/src/share/classes/com/sun/java/util/jar/pack/ConstantPool.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/java/util/jar/pack/ConstantPool.java Wed Jul 05 19:46:31 2017 +0200
@@ -1026,7 +1026,7 @@
}
static
String stringValueOf(MethodHandleEntry bsmRef, Entry[] argRefs) {
- StringBuffer sb = new StringBuffer(bsmRef.stringValue());
+ StringBuilder sb = new StringBuilder(bsmRef.stringValue());
// Arguments are formatted as "<foo;bar;baz>" instead of "[foo,bar,baz]".
// This ensures there will be no confusion if "[,]" appear inside of names.
char nextSep = '<';
--- a/jdk/src/share/classes/com/sun/jmx/snmp/IPAcl/NetMaskImpl.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/jmx/snmp/IPAcl/NetMaskImpl.java Wed Jul 05 19:46:31 2017 +0200
@@ -63,12 +63,12 @@
if (SNMP_LOGGER.isLoggable(Level.FINEST)) {
SNMP_LOGGER.logp(Level.FINEST, NetMaskImpl.class.getName(),
"extractSubNet", "BINARY ARRAY :");
- StringBuffer buff = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
for(int i =0; i < addrLength; i++) {
- buff.append((b[i] &0xFF) +":");
+ sb.append((b[i] & 0xFF) + ":");
}
SNMP_LOGGER.logp(Level.FINEST, NetMaskImpl.class.getName(),
- "extractSubNet", buff.toString());
+ "extractSubNet", sb.toString());
}
// 8 is a byte size. Common to any InetAddress (V4 or V6).
--- a/jdk/src/share/classes/com/sun/jmx/snmp/IPAcl/ParseException.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/jmx/snmp/IPAcl/ParseException.java Wed Jul 05 19:46:31 2017 +0200
@@ -170,7 +170,7 @@
* string literal.
*/
protected String add_escapes(String str) {
- StringBuffer retval = new StringBuffer();
+ StringBuilder retval = new StringBuilder();
char ch;
for (int i = 0; i < str.length(); i++) {
switch (str.charAt(i))
--- a/jdk/src/share/classes/com/sun/jmx/snmp/IPAcl/SnmpAcl.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/jmx/snmp/IPAcl/SnmpAcl.java Wed Jul 05 19:46:31 2017 +0200
@@ -186,8 +186,8 @@
public static String getDefaultAclFileName() {
final String fileSeparator =
System.getProperty("file.separator");
- final StringBuffer defaultAclName =
- new StringBuffer(System.getProperty("java.home")).
+ final StringBuilder defaultAclName =
+ new StringBuilder(System.getProperty("java.home")).
append(fileSeparator).append("lib").append(fileSeparator).
append("snmp.acl");
return defaultAclName.toString();
--- a/jdk/src/share/classes/com/sun/jmx/snmp/IPAcl/TokenMgrError.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/jmx/snmp/IPAcl/TokenMgrError.java Wed Jul 05 19:46:31 2017 +0200
@@ -65,7 +65,7 @@
* equivalents in the given string
*/
protected static final String addEscapes(String str) {
- StringBuffer retval = new StringBuffer();
+ StringBuilder retval = new StringBuilder();
char ch;
for (int i = 0; i < str.length(); i++) {
switch (str.charAt(i))
--- a/jdk/src/share/classes/com/sun/jmx/snmp/SnmpMessage.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/jmx/snmp/SnmpMessage.java Wed Jul 05 19:46:31 2017 +0200
@@ -347,7 +347,7 @@
* @return The string containing the dump.
*/
public String printMessage() {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
if (community == null) {
sb.append("Community: null") ;
}
--- a/jdk/src/share/classes/com/sun/jmx/snmp/SnmpMsg.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/jmx/snmp/SnmpMsg.java Wed Jul 05 19:46:31 2017 +0200
@@ -181,22 +181,22 @@
* @return The string containing the dump.
*/
public static String dumpHexBuffer(byte [] b, int offset, int len) {
- StringBuffer buf = new StringBuffer(len << 1) ;
+ StringBuilder sb = new StringBuilder(len << 1) ;
int k = 1 ;
int flen = offset + len ;
for (int i = offset; i < flen ; i++) {
int j = b[i] & 0xFF ;
- buf.append(Character.forDigit((j >>> 4) , 16)) ;
- buf.append(Character.forDigit((j & 0x0F), 16)) ;
+ sb.append(Character.forDigit((j >>> 4), 16)) ;
+ sb.append(Character.forDigit((j & 0x0F), 16)) ;
k++ ;
if (k%16 == 0) {
- buf.append('\n') ;
+ sb.append('\n') ;
k = 1 ;
} else
- buf.append(' ') ;
+ sb.append(' ') ;
}
- return buf.toString() ;
+ return sb.toString() ;
}
/**
@@ -205,7 +205,7 @@
* @return The string containing the dump.
*/
public String printMessage() {
- StringBuffer sb = new StringBuffer() ;
+ StringBuilder sb = new StringBuilder() ;
sb.append("Version: ") ;
sb.append(version) ;
sb.append("\n") ;
--- a/jdk/src/share/classes/com/sun/jmx/snmp/SnmpOpaque.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/jmx/snmp/SnmpOpaque.java Wed Jul 05 19:46:31 2017 +0200
@@ -73,7 +73,7 @@
* @return The <CODE>String</CODE> representation of the value.
*/
public String toString() {
- StringBuffer result = new StringBuffer() ;
+ StringBuilder result = new StringBuilder() ;
for (int i = 0 ; i < value.length ; i++) {
byte b = value[i] ;
int n = (b >= 0) ? b : b + 256 ;
--- a/jdk/src/share/classes/com/sun/jmx/snmp/SnmpV3Message.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/jmx/snmp/SnmpV3Message.java Wed Jul 05 19:46:31 2017 +0200
@@ -478,7 +478,7 @@
* @return The string containing the dump.
*/
public String printMessage() {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
sb.append("msgId : " + msgId + "\n");
sb.append("msgMaxSize : " + msgMaxSize + "\n");
sb.append("msgFlags : " + msgFlags + "\n");
--- a/jdk/src/share/classes/com/sun/jndi/cosnaming/CNNameParser.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/jndi/cosnaming/CNNameParser.java Wed Jul 05 19:46:31 2017 +0200
@@ -96,7 +96,7 @@
* Used by CNCtx.getNameInNamespace(), CNCompoundName.toString().
*/
static String cosNameToInsString(NameComponent[] cname) {
- StringBuffer str = new StringBuffer();
+ StringBuilder str = new StringBuilder();
for ( int i = 0; i < cname.length; i++) {
if ( i > 0) {
str.append(compSeparator);
@@ -254,7 +254,7 @@
}
private static String stringifyComponent(NameComponent comp) {
- StringBuffer one = new StringBuffer(escape(comp.id));
+ StringBuilder one = new StringBuilder(escape(comp.id));
if (comp.kind != null && !comp.kind.equals("")) {
one.append(kindSeparator + escape(comp.kind));
}
--- a/jdk/src/share/classes/com/sun/jndi/dns/DnsContextFactory.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/jndi/dns/DnsContextFactory.java Wed Jul 05 19:46:31 2017 +0200
@@ -198,14 +198,14 @@
}
}
- StringBuffer buf = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
for (int i = 0; i < servers.length; i++) {
if (i > 0) {
- buf.append(' ');
+ sb.append(' ');
}
- buf.append("dns://").append(servers[i]).append(path);
+ sb.append("dns://").append(servers[i]).append(path);
}
- return buf.toString();
+ return sb.toString();
}
/*
--- a/jdk/src/share/classes/com/sun/jndi/dns/DnsName.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/jndi/dns/DnsName.java Wed Jul 05 19:46:31 2017 +0200
@@ -415,7 +415,7 @@
*/
private void parse(String name) throws InvalidNameException {
- StringBuffer label = new StringBuffer(); // label being parsed
+ StringBuilder label = new StringBuilder(); // label being parsed
for (int i = 0; i < name.length(); i++) {
char c = name.charAt(i);
@@ -564,15 +564,15 @@
* into account. See compareLabels().
*/
private static String keyForLabel(String label) {
- StringBuffer buf = new StringBuffer(label.length());
+ StringBuilder sb = new StringBuilder(label.length());
for (int i = 0; i < label.length(); i++) {
char c = label.charAt(i);
if (c >= 'A' && c <= 'Z') {
c += 'a' - 'A'; // to lower case
}
- buf.append(c);
+ sb.append(c);
}
- return buf.toString();
+ return sb.toString();
}
--- a/jdk/src/share/classes/com/sun/jndi/dns/ResourceRecord.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/jndi/dns/ResourceRecord.java Wed Jul 05 19:46:31 2017 +0200
@@ -596,21 +596,21 @@
// If bestBase != -1, compress zeros in [bestBase, bestBase+bestLen)
boolean compress = (bestBase != -1);
- StringBuffer buf = new StringBuffer(40);
+ StringBuilder sb = new StringBuilder(40);
if (bestBase == 0) {
- buf.append(':');
+ sb.append(':');
}
for (int i = 0; i < 8; i++) {
if (!compress || (i < bestBase) || (i >= bestBase + bestLen)) {
- buf.append(Integer.toHexString(addr6[i]));
+ sb.append(Integer.toHexString(addr6[i]));
if (i < 7) {
- buf.append(':');
+ sb.append(':');
}
} else if (compress && (i == bestBase)) { // first compressed zero
- buf.append(':');
+ sb.append(':');
}
}
- return buf.toString();
+ return sb.toString();
}
}
--- a/jdk/src/share/classes/com/sun/jndi/ldap/ClientId.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/jndi/ldap/ClientId.java Wed Jul 05 19:46:31 2017 +0200
@@ -210,7 +210,7 @@
if (ctls == null) {
return "";
}
- StringBuffer str = new StringBuffer();
+ StringBuilder str = new StringBuilder();
for (int i = 0; i < ctls.length; i++) {
str.append(ctls[i].getID());
str.append(' ');
--- a/jdk/src/share/classes/com/sun/jndi/ldap/DigestClientId.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/jndi/ldap/DigestClientId.java Wed Jul 05 19:46:31 2017 +0200
@@ -103,14 +103,14 @@
public String toString() {
if (propvals != null) {
- StringBuffer buf = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
for (int i = 0; i < propvals.length; i++) {
- buf.append(':');
+ sb.append(':');
if (propvals[i] != null) {
- buf.append(propvals[i]);
+ sb.append(propvals[i]);
}
}
- return super.toString() + buf.toString();
+ return super.toString() + sb.toString();
} else {
return super.toString();
}
--- a/jdk/src/share/classes/com/sun/jndi/ldap/LdapSchemaParser.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/jndi/ldap/LdapSchemaParser.java Wed Jul 05 19:46:31 2017 +0200
@@ -767,7 +767,7 @@
final private String classDef2ObjectDesc(Attributes attrs)
throws NamingException {
- StringBuffer objectDesc = new StringBuffer("( ");
+ StringBuilder objectDesc = new StringBuilder("( ");
Attribute attr = null;
int count = 0;
@@ -879,7 +879,7 @@
final private String attrDef2AttrDesc(Attributes attrs)
throws NamingException {
- StringBuffer attrDesc = new StringBuffer("( "); // opening parens
+ StringBuilder attrDesc = new StringBuilder("( "); // opening parens
Attribute attr = null;
int count = 0;
@@ -1012,7 +1012,7 @@
final private String syntaxDef2SyntaxDesc(Attributes attrs)
throws NamingException {
- StringBuffer syntaxDesc = new StringBuffer("( "); // opening parens
+ StringBuilder syntaxDesc = new StringBuilder("( "); // opening parens
Attribute attr = null;
int count = 0;
@@ -1068,7 +1068,7 @@
final private String matchRuleDef2MatchRuleDesc(Attributes attrs)
throws NamingException {
- StringBuffer matchRuleDesc = new StringBuffer("( "); // opening parens
+ StringBuilder matchRuleDesc = new StringBuilder("( "); // opening parens
Attribute attr = null;
int count = 0;
@@ -1196,7 +1196,7 @@
// write QDList
- StringBuffer qdList = new StringBuffer(attr.getID());
+ StringBuilder qdList = new StringBuilder(attr.getID());
qdList.append(WHSP);
qdList.append(OID_LIST_BEGIN);
@@ -1233,7 +1233,7 @@
// write OID List
- StringBuffer oidList = new StringBuffer(oidsAttr.getID());
+ StringBuilder oidList = new StringBuilder(oidsAttr.getID());
oidList.append(WHSP);
oidList.append(OID_LIST_BEGIN);
--- a/jdk/src/share/classes/com/sun/jndi/ldap/ServiceLocator.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/jndi/ldap/ServiceLocator.java Wed Jul 05 19:46:31 2017 +0200
@@ -68,7 +68,7 @@
if (dn == null) {
return null;
}
- StringBuffer domain = new StringBuffer();
+ StringBuilder domain = new StringBuilder();
LdapName ldapName = new LdapName(dn);
// process RDNs left-to-right
--- a/jdk/src/share/classes/com/sun/jndi/ldap/sasl/DefaultCallbackHandler.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/jndi/ldap/sasl/DefaultCallbackHandler.java Wed Jul 05 19:46:31 2017 +0200
@@ -88,7 +88,7 @@
}
}
if (selected == -1) {
- StringBuffer allChoices = new StringBuffer();
+ StringBuilder allChoices = new StringBuilder();
for (int j = 0; j < choices.length; j++) {
allChoices.append(choices[j] + ",");
}
--- a/jdk/src/share/classes/com/sun/jndi/toolkit/dir/SearchFilter.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/jndi/toolkit/dir/SearchFilter.java Wed Jul 05 19:46:31 2017 +0200
@@ -520,30 +520,30 @@
str = (String)obj;
}
int len = str.length();
- StringBuffer buf = new StringBuffer(len);
+ StringBuilder sb = new StringBuilder(len);
char ch;
for (int i = 0; i < len; i++) {
switch (ch=str.charAt(i)) {
case '*':
- buf.append("\\2a");
+ sb.append("\\2a");
break;
case '(':
- buf.append("\\28");
+ sb.append("\\28");
break;
case ')':
- buf.append("\\29");
+ sb.append("\\29");
break;
case '\\':
- buf.append("\\5c");
+ sb.append("\\5c");
break;
case 0:
- buf.append("\\00");
+ sb.append("\\00");
break;
default:
- buf.append(ch);
+ sb.append(ch);
}
}
- return buf.toString();
+ return sb.toString();
}
@@ -585,7 +585,7 @@
int param;
int where = 0, start = 0;
- StringBuffer answer = new StringBuffer(expr.length());
+ StringBuilder answer = new StringBuilder(expr.length());
while ((where = findUnescaped('{', expr, start)) >= 0) {
int pstart = where + 1; // skip '{'
--- a/jdk/src/share/classes/com/sun/media/sound/SoftPerformer.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/media/sound/SoftPerformer.java Wed Jul 05 19:46:31 2017 +0200
@@ -326,7 +326,7 @@
private static KeySortComparator keySortComparator = new KeySortComparator();
private String extractKeys(ModelConnectionBlock conn) {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
if (conn.getSources() != null) {
sb.append("[");
ModelSource[] srcs = conn.getSources();
--- a/jdk/src/share/classes/com/sun/media/sound/WaveExtensibleFileReader.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/media/sound/WaveExtensibleFileReader.java Wed Jul 05 19:46:31 2017 +0200
@@ -162,7 +162,7 @@
0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71);
private String decodeChannelMask(long channelmask) {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
long m = 1;
for (int i = 0; i < allchannelnames.length; i++) {
if ((channelmask & m) != 0L) {
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/utils/Base64.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/utils/Base64.java Wed Jul 05 19:46:31 2017 +0200
@@ -257,7 +257,7 @@
public static final byte[] decode(Element element) throws Base64DecodingException {
Node sibling = element.getFirstChild();
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
while (sibling != null) {
if (sibling.getNodeType() == Node.TEXT_NODE) {
--- a/jdk/src/share/classes/com/sun/security/sasl/CramMD5Base.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/security/sasl/CramMD5Base.java Wed Jul 05 19:46:31 2017 +0200
@@ -195,7 +195,7 @@
digest = md5.digest();
// Get character representation of digest
- StringBuffer digestString = new StringBuffer();
+ StringBuilder digestString = new StringBuilder();
for (i = 0; i < digest.length; i++) {
if ((digest[i] & 0x000000ff) < 0x10) {
--- a/jdk/src/share/classes/com/sun/security/sasl/CramMD5Server.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/security/sasl/CramMD5Server.java Wed Jul 05 19:46:31 2017 +0200
@@ -117,15 +117,15 @@
long rand = random.nextLong();
long timestamp = System.currentTimeMillis();
- StringBuffer buf = new StringBuffer();
- buf.append('<');
- buf.append(rand);
- buf.append('.');
- buf.append(timestamp);
- buf.append('@');
- buf.append(fqdn);
- buf.append('>');
- String challengeStr = buf.toString();
+ StringBuilder sb = new StringBuilder();
+ sb.append('<');
+ sb.append(rand);
+ sb.append('.');
+ sb.append(timestamp);
+ sb.append('@');
+ sb.append(fqdn);
+ sb.append('>');
+ String challengeStr = sb.toString();
logger.log(Level.FINE,
"CRAMSRV01:Generated challenge: {0}", challengeStr);
--- a/jdk/src/share/classes/com/sun/security/sasl/digest/DigestMD5Base.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/security/sasl/digest/DigestMD5Base.java Wed Jul 05 19:46:31 2017 +0200
@@ -387,7 +387,7 @@
protected byte[] binaryToHex(byte[] digest) throws
UnsupportedEncodingException {
- StringBuffer digestString = new StringBuffer();
+ StringBuilder digestString = new StringBuilder();
for (int i = 0; i < digest.length; i ++) {
if ((digest[i] & 0x000000ff) < 0x10) {
@@ -598,7 +598,7 @@
protected static String nonceCountToHex(int count) {
String str = Integer.toHexString(count);
- StringBuffer pad = new StringBuffer();
+ StringBuilder pad = new StringBuilder();
if (str.length() < 8) {
for (int i = 0; i < 8-str.length(); i ++) {
--- a/jdk/src/share/classes/com/sun/security/sasl/digest/DigestMD5Server.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/security/sasl/digest/DigestMD5Server.java Wed Jul 05 19:46:31 2017 +0200
@@ -203,19 +203,19 @@
String supportedCiphers = null;
if ((allQop&PRIVACY_PROTECTION) != 0) {
myCiphers = getPlatformCiphers();
- StringBuffer buf = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
// myCipher[i] is a byte that indicates whether CIPHER_TOKENS[i]
// is supported
for (int i = 0; i < CIPHER_TOKENS.length; i++) {
if (myCiphers[i] != 0) {
- if (buf.length() > 0) {
- buf.append(',');
+ if (sb.length() > 0) {
+ sb.append(',');
}
- buf.append(CIPHER_TOKENS[i]);
+ sb.append(CIPHER_TOKENS[i]);
}
}
- supportedCiphers = buf.toString();
+ supportedCiphers = sb.toString();
}
try {
--- a/jdk/src/share/classes/com/sun/security/sasl/util/AbstractSaslImpl.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/security/sasl/util/AbstractSaslImpl.java Wed Jul 05 19:46:31 2017 +0200
@@ -80,13 +80,13 @@
"SASLIMPL02:Preferred qop mask: {0}", new Byte(allQop));
if (qop.length > 0) {
- StringBuffer qopbuf = new StringBuffer();
+ StringBuilder str = new StringBuilder();
for (int i = 0; i < qop.length; i++) {
- qopbuf.append(Byte.toString(qop[i]));
- qopbuf.append(' ');
+ str.append(Byte.toString(qop[i]));
+ str.append(' ');
}
logger.logp(Level.FINE, myClassName, "constructor",
- "SASLIMPL03:Preferred qops : {0}", qopbuf.toString());
+ "SASLIMPL03:Preferred qops : {0}", str.toString());
}
}
@@ -95,13 +95,13 @@
logger.logp(Level.FINE, myClassName, "constructor",
"SASLIMPL04:Preferred strength property: {0}", prop);
if (logger.isLoggable(Level.FINE) && strength.length > 0) {
- StringBuffer strbuf = new StringBuffer();
+ StringBuilder str = new StringBuilder();
for (int i = 0; i < strength.length; i++) {
- strbuf.append(Byte.toString(strength[i]));
- strbuf.append(' ');
+ str.append(Byte.toString(strength[i]));
+ str.append(' ');
}
logger.logp(Level.FINE, myClassName, "constructor",
- "SASLIMPL05:Cipher strengths: {0}", strbuf.toString());
+ "SASLIMPL05:Cipher strengths: {0}", str.toString());
}
// Max receive buffer size
--- a/jdk/src/share/classes/com/sun/tools/example/debug/bdi/ExceptionSpec.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/tools/example/debug/bdi/ExceptionSpec.java Wed Jul 05 19:46:31 2017 +0200
@@ -102,8 +102,8 @@
@Override
public String toString() {
- StringBuffer buffer = new StringBuffer("exception catch ");
- buffer.append(refSpec.toString());
- return buffer.toString();
+ StringBuilder sb = new StringBuilder("exception catch ");
+ sb.append(refSpec.toString());
+ return sb.toString();
}
}
--- a/jdk/src/share/classes/com/sun/tools/example/debug/bdi/LineBreakpointSpec.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/tools/example/debug/bdi/LineBreakpointSpec.java Wed Jul 05 19:46:31 2017 +0200
@@ -118,13 +118,13 @@
@Override
public String toString() {
- StringBuffer buffer = new StringBuffer("breakpoint ");
- buffer.append(refSpec.toString());
- buffer.append(':');
- buffer.append(lineNumber);
- buffer.append(" (");
- buffer.append(getStatusString());
- buffer.append(')');
- return buffer.toString();
+ StringBuilder sb = new StringBuilder("breakpoint ");
+ sb.append(refSpec.toString());
+ sb.append(':');
+ sb.append(lineNumber);
+ sb.append(" (");
+ sb.append(getStatusString());
+ sb.append(')');
+ return sb.toString();
}
}
--- a/jdk/src/share/classes/com/sun/tools/example/debug/bdi/MethodBreakpointSpec.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/tools/example/debug/bdi/MethodBreakpointSpec.java Wed Jul 05 19:46:31 2017 +0200
@@ -126,26 +126,26 @@
@Override
public String toString() {
- StringBuffer buffer = new StringBuffer("breakpoint ");
- buffer.append(refSpec.toString());
- buffer.append('.');
- buffer.append(methodId);
+ StringBuilder sb = new StringBuilder("breakpoint ");
+ sb.append(refSpec.toString());
+ sb.append('.');
+ sb.append(methodId);
if (methodArgs != null) {
boolean first = true;
- buffer.append('(');
+ sb.append('(');
for (String name : methodArgs) {
if (!first) {
- buffer.append(',');
+ sb.append(',');
}
- buffer.append(name);
+ sb.append(name);
first = false;
}
- buffer.append(")");
+ sb.append(")");
}
- buffer.append(" (");
- buffer.append(getStatusString());
- buffer.append(')');
- return buffer.toString();
+ sb.append(" (");
+ sb.append(getStatusString());
+ sb.append(')');
+ return sb.toString();
}
private boolean isValidMethodName(String s) {
@@ -225,8 +225,8 @@
* stripping whitespace after the name ends.
*/
int i = 0;
- StringBuffer typePart = new StringBuffer();
- StringBuffer arrayPart = new StringBuffer();
+ StringBuilder typePart = new StringBuilder();
+ StringBuilder arrayPart = new StringBuilder();
name = name.trim();
int nameLength = name.length();
/*
--- a/jdk/src/share/classes/com/sun/tools/example/debug/expr/ExpressionParser.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/tools/example/debug/expr/ExpressionParser.java Wed Jul 05 19:46:31 2017 +0200
@@ -185,7 +185,7 @@
}
final public String Name() throws ParseException {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
jj_consume_token(IDENTIFIER);
sb.append(token);
label_2:
--- a/jdk/src/share/classes/com/sun/tools/example/debug/expr/ParseException.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/tools/example/debug/expr/ParseException.java Wed Jul 05 19:46:31 2017 +0200
@@ -114,7 +114,7 @@
int[][] expectedTokenSequences,
String[] tokenImage) {
String eol = System.getProperty("line.separator", "\n");
- StringBuffer expected = new StringBuffer();
+ StringBuilder expected = new StringBuilder();
int maxSize = 0;
for (int i = 0; i < expectedTokenSequences.length; i++) {
if (maxSize < expectedTokenSequences[i].length) {
@@ -164,7 +164,7 @@
* string literal.
*/
static String add_escapes(String str) {
- StringBuffer retval = new StringBuffer();
+ StringBuilder retval = new StringBuilder();
char ch;
for (int i = 0; i < str.length(); i++) {
switch (str.charAt(i))
--- a/jdk/src/share/classes/com/sun/tools/example/debug/expr/TokenMgrError.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/tools/example/debug/expr/TokenMgrError.java Wed Jul 05 19:46:31 2017 +0200
@@ -73,7 +73,7 @@
* equivalents in the given string
*/
protected static final String addEscapes(String str) {
- StringBuffer retval = new StringBuffer();
+ StringBuilder retval = new StringBuilder();
char ch;
for (int i = 0; i < str.length(); i++) {
switch (str.charAt(i))
--- a/jdk/src/share/classes/com/sun/tools/example/debug/gui/CommandInterpreter.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/tools/example/debug/gui/CommandInterpreter.java Wed Jul 05 19:46:31 2017 +0200
@@ -267,7 +267,7 @@
buf[j] = ' ';
}
buf[79] = '\0';
- StringBuffer sbOut = new StringBuffer();
+ StringBuilder sbOut = new StringBuilder();
sbOut.append(buf);
// Right-justify the thread number at start of output string
@@ -381,16 +381,16 @@
}
} else {
clname = t.nextToken();
- StringBuffer sbuf = new StringBuffer();
+ StringBuilder str = new StringBuilder();
// Allow VM arguments to be specified here?
while (t.hasMoreTokens()) {
String tok = t.nextToken();
- sbuf.append(tok);
+ str.append(tok);
if (t.hasMoreTokens()) {
- sbuf.append(' ');
+ str.append(' ');
}
}
- String args = sbuf.toString();
+ String args = str.toString();
try {
String vmArgs = context.getVmArguments();
runtime.run(suspended, vmArgs, clname, args);
--- a/jdk/src/share/classes/com/sun/tools/example/debug/gui/ContextManager.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/tools/example/debug/gui/ContextManager.java Wed Jul 05 19:46:31 2017 +0200
@@ -333,7 +333,7 @@
private String processClasspathDefaults(String javaArgs) {
if (javaArgs.indexOf("-classpath ") == -1) {
- StringBuffer munged = new StringBuffer(javaArgs);
+ StringBuilder munged = new StringBuilder(javaArgs);
SearchPath classpath = classManager.getClassPath();
if (classpath.isEmpty()) {
String envcp = System.getProperty("env.class.path");
--- a/jdk/src/share/classes/com/sun/tools/example/debug/gui/SourceModel.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/tools/example/debug/gui/SourceModel.java Wed Jul 05 19:46:31 2017 +0200
@@ -236,7 +236,7 @@
private String expandTabs(String s) {
int col = 0;
int len = s.length();
- StringBuffer sb = new StringBuffer(132);
+ StringBuilder sb = new StringBuilder(132);
for (int i = 0; i < len; i++) {
char c = s.charAt(i);
sb.append(c);
--- a/jdk/src/share/classes/com/sun/tools/example/debug/tty/BreakpointSpec.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/tools/example/debug/tty/BreakpointSpec.java Wed Jul 05 19:46:31 2017 +0200
@@ -154,27 +154,27 @@
@Override
public String toString() {
- StringBuffer buffer = new StringBuffer(refSpec.toString());
+ StringBuilder sb = new StringBuilder(refSpec.toString());
if (isMethodBreakpoint()) {
- buffer.append('.');
- buffer.append(methodId);
+ sb.append('.');
+ sb.append(methodId);
if (methodArgs != null) {
boolean first = true;
- buffer.append('(');
+ sb.append('(');
for (String arg : methodArgs) {
if (!first) {
- buffer.append(',');
+ sb.append(',');
}
- buffer.append(arg);
+ sb.append(arg);
first = false;
}
- buffer.append(")");
+ sb.append(")");
}
} else {
- buffer.append(':');
- buffer.append(lineNumber);
+ sb.append(':');
+ sb.append(lineNumber);
}
- return MessageOutput.format("breakpoint", buffer.toString());
+ return MessageOutput.format("breakpoint", sb.toString());
}
private Location location(ReferenceType refType) throws
@@ -275,8 +275,8 @@
* stripping whitespace after the name ends
*/
int i = 0;
- StringBuffer typePart = new StringBuffer();
- StringBuffer arrayPart = new StringBuffer();
+ StringBuilder typePart = new StringBuilder();
+ StringBuilder arrayPart = new StringBuilder();
name = name.trim();
int nameLength = name.length();
/*
--- a/jdk/src/share/classes/com/sun/tools/example/debug/tty/Commands.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/tools/example/debug/tty/Commands.java Wed Jul 05 19:46:31 2017 +0200
@@ -164,30 +164,30 @@
}
String typedName(Method method) {
- StringBuffer buf = new StringBuffer();
- buf.append(method.name());
- buf.append("(");
+ StringBuilder sb = new StringBuilder();
+ sb.append(method.name());
+ sb.append("(");
List<String> args = method.argumentTypeNames();
int lastParam = args.size() - 1;
// output param types except for the last
for (int ii = 0; ii < lastParam; ii++) {
- buf.append(args.get(ii));
- buf.append(", ");
+ sb.append(args.get(ii));
+ sb.append(", ");
}
if (lastParam >= 0) {
// output the last param
String lastStr = args.get(lastParam);
if (method.isVarArgs()) {
// lastParam is an array. Replace the [] with ...
- buf.append(lastStr.substring(0, lastStr.length() - 2));
- buf.append("...");
+ sb.append(lastStr.substring(0, lastStr.length() - 2));
+ sb.append("...");
} else {
- buf.append(lastStr);
+ sb.append(lastStr);
}
}
- buf.append(")");
- return buf.toString();
+ sb.append(")");
+ return sb.toString();
}
void commandConnectors(VirtualMachineManager vmm) {
@@ -226,7 +226,7 @@
}
void commandClasses() {
- StringBuffer classList = new StringBuffer();
+ StringBuilder classList = new StringBuilder();
for (ReferenceType refType : Env.vm().allClasses()) {
classList.append(refType.name());
classList.append("\n");
@@ -309,7 +309,7 @@
String idClass = t.nextToken();
ReferenceType cls = Env.getReferenceTypeFromToken(idClass);
if (cls != null) {
- StringBuffer methodsList = new StringBuffer();
+ StringBuilder methodsList = new StringBuilder();
for (Method method : cls.allMethods()) {
methodsList.append(method.declaringType().name());
methodsList.append(" ");
@@ -333,7 +333,7 @@
if (cls != null) {
List<Field> fields = cls.allFields();
List<Field> visible = cls.visibleFields();
- StringBuffer fieldsList = new StringBuffer();
+ StringBuilder fieldsList = new StringBuilder();
for (Field field : fields) {
String s;
if (!visible.contains(field)) {
@@ -391,11 +391,11 @@
* very long thread names, at the possible cost of lines
* being wrapped by the display device.
*/
- StringBuffer idBuffer = new StringBuffer(Env.description(thr));
+ StringBuilder idBuffer = new StringBuilder(Env.description(thr));
for (int i = idBuffer.length(); i < maxIdLength; i++) {
idBuffer.append(" ");
}
- StringBuffer nameBuffer = new StringBuffer(thr.name());
+ StringBuilder nameBuffer = new StringBuilder(thr.name());
for (int i = nameBuffer.length(); i < maxNameLength; i++) {
nameBuffer.append(" ");
}
@@ -1606,16 +1606,16 @@
private void dump(ObjectReference obj, ReferenceType refType,
ReferenceType refTypeBase) {
for (Field field : refType.fields()) {
- StringBuffer o = new StringBuffer();
- o.append(" ");
+ StringBuilder sb = new StringBuilder();
+ sb.append(" ");
if (!refType.equals(refTypeBase)) {
- o.append(refType.name());
- o.append(".");
+ sb.append(refType.name());
+ sb.append(".");
}
- o.append(field.name());
- o.append(MessageOutput.format("colon space"));
- o.append(obj.getValue(field));
- MessageOutput.printDirectln(o.toString()); // Special case: use printDirectln()
+ sb.append(field.name());
+ sb.append(MessageOutput.format("colon space"));
+ sb.append(obj.getValue(field));
+ MessageOutput.printDirectln(sb.toString()); // Special case: use printDirectln()
}
if (refType instanceof ClassType) {
ClassType sup = ((ClassType)refType).superclass();
@@ -1954,7 +1954,7 @@
}
}
- StringBuffer line = new StringBuffer(80);
+ StringBuilder line = new StringBuilder(80);
line.append("0000: ");
for (int i = 0; i < bytecodes.length; i++) {
if ((i > 0) && (i % 16 == 0)) {
--- a/jdk/src/share/classes/com/sun/tools/example/debug/tty/Env.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/tools/example/debug/tty/Env.java Wed Jul 05 19:46:31 2017 +0200
@@ -114,12 +114,12 @@
}
static String excludesString() {
- StringBuffer buffer = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
for (String pattern : excludes()) {
- buffer.append(pattern);
- buffer.append(",");
+ sb.append(pattern);
+ sb.append(",");
}
- return buffer.toString();
+ return sb.toString();
}
static void addExcludes(StepRequest request) {
--- a/jdk/src/share/classes/com/sun/tools/example/debug/tty/TTY.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/tools/example/debug/tty/TTY.java Wed Jul 05 19:46:31 2017 +0200
@@ -827,17 +827,17 @@
private static String addArgument(String string, String argument) {
if (hasWhitespace(argument) || argument.indexOf(',') != -1) {
// Quotes were stripped out for this argument, add 'em back.
- StringBuffer buffer = new StringBuffer(string);
- buffer.append('"');
+ StringBuilder sb = new StringBuilder(string);
+ sb.append('"');
for (int i = 0; i < argument.length(); i++) {
char c = argument.charAt(i);
if (c == '"') {
- buffer.append('\\');
+ sb.append('\\');
}
- buffer.append(c);
+ sb.append(c);
}
- buffer.append("\" ");
- return buffer.toString();
+ sb.append("\" ");
+ return sb.toString();
} else {
return string + argument + ' ';
}
--- a/jdk/src/share/classes/com/sun/tools/example/trace/Trace.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/tools/example/trace/Trace.java Wed Jul 05 19:46:31 2017 +0200
@@ -121,7 +121,7 @@
usage();
System.exit(1);
}
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
sb.append(args[inx]);
for (++inx; inx < args.length; ++inx) {
sb.append(' ');
--- a/jdk/src/share/classes/com/sun/tools/hat/internal/util/Misc.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/tools/hat/internal/util/Misc.java Wed Jul 05 19:46:31 2017 +0200
@@ -83,30 +83,30 @@
public static String encodeHtml(String str) {
final int len = str.length();
- StringBuffer buf = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
for (int i = 0; i < len; i++) {
char ch = str.charAt(i);
if (ch == '<') {
- buf.append("<");
+ sb.append("<");
} else if (ch == '>') {
- buf.append(">");
+ sb.append(">");
} else if (ch == '"') {
- buf.append(""");
+ sb.append(""");
} else if (ch == '\'') {
- buf.append("'");
+ sb.append("'");
} else if (ch == '&') {
- buf.append("&");
+ sb.append("&");
} else if (ch < ' ') {
- buf.append("&#" + Integer.toString(ch) + ";");
+ sb.append("&#" + Integer.toString(ch) + ";");
} else {
int c = (ch & 0xFFFF);
if (c > 127) {
- buf.append("&#" + Integer.toString(c) + ";");
+ sb.append("&#" + Integer.toString(c) + ";");
} else {
- buf.append(ch);
+ sb.append(ch);
}
}
}
- return buf.toString();
+ return sb.toString();
}
}
--- a/jdk/src/share/classes/com/sun/tools/jdi/FieldImpl.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/tools/jdi/FieldImpl.java Wed Jul 05 19:46:31 2017 +0200
@@ -95,12 +95,12 @@
}
public String toString() {
- StringBuffer buf = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
- buf.append(declaringType().name());
- buf.append('.');
- buf.append(name());
+ sb.append(declaringType().name());
+ sb.append('.');
+ sb.append(name());
- return buf.toString();
+ return sb.toString();
}
}
--- a/jdk/src/share/classes/com/sun/tools/jdi/JNITypeParser.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/tools/jdi/JNITypeParser.java Wed Jul 05 19:46:31 2017 +0200
@@ -44,11 +44,11 @@
}
static String typeNameToSignature(String signature) {
- StringBuffer buffer = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
int firstIndex = signature.indexOf('[');
int index = firstIndex;
while (index != -1) {
- buffer.append('[');
+ sb.append('[');
index = signature.indexOf('[', index + 1);
}
@@ -57,28 +57,28 @@
}
if (signature.equals("boolean")) {
- buffer.append('Z');
+ sb.append('Z');
} else if (signature.equals("byte")) {
- buffer.append('B');
+ sb.append('B');
} else if (signature.equals("char")) {
- buffer.append('C');
+ sb.append('C');
} else if (signature.equals("short")) {
- buffer.append('S');
+ sb.append('S');
} else if (signature.equals("int")) {
- buffer.append('I');
+ sb.append('I');
} else if (signature.equals("long")) {
- buffer.append('J');
+ sb.append('J');
} else if (signature.equals("float")) {
- buffer.append('F');
+ sb.append('F');
} else if (signature.equals("double")) {
- buffer.append('D');
+ sb.append('D');
} else {
- buffer.append('L');
- buffer.append(signature.replace('.', '/'));
- buffer.append(';');
+ sb.append('L');
+ sb.append(signature.replace('.', '/'));
+ sb.append(';');
}
- return buffer.toString();
+ return sb.toString();
}
String typeName() {
--- a/jdk/src/share/classes/com/sun/tools/jdi/MethodImpl.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/tools/jdi/MethodImpl.java Wed Jul 05 19:46:31 2017 +0200
@@ -387,7 +387,7 @@
}
public String toString() {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
sb.append(declaringType().name());
sb.append(".");
sb.append(name());
--- a/jdk/src/share/classes/com/sun/tools/jdi/ReferenceTypeImpl.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/tools/jdi/ReferenceTypeImpl.java Wed Jul 05 19:46:31 2017 +0200
@@ -751,7 +751,7 @@
String baseSourceDir() {
if (baseSourceDir == null) {
String typeName = name();
- StringBuffer sb = new StringBuffer(typeName.length() + 10);
+ StringBuilder sb = new StringBuilder(typeName.length() + 10);
int index = 0;
int nextIndex;
--- a/jdk/src/share/classes/com/sun/tools/jdi/SDE.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/tools/jdi/SDE.java Wed Jul 05 19:46:31 2017 +0200
@@ -56,16 +56,16 @@
if (sourcePath == null) {
sourcePath = refType.baseSourceDir() + sourceName;
} else {
- StringBuffer buf = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
for (int i = 0; i < sourcePath.length(); ++i) {
char ch = sourcePath.charAt(i);
if (ch == '/') {
- buf.append(File.separatorChar);
+ sb.append(File.separatorChar);
} else {
- buf.append(ch);
+ sb.append(ch);
}
}
- sourcePath = buf.toString();
+ sourcePath = sb.toString();
}
isConverted = true;
}
@@ -327,7 +327,7 @@
}
String readLine() {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
char ch;
ignoreWhite();
--- a/jdk/src/share/classes/com/sun/tools/jdi/TargetVM.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/tools/jdi/TargetVM.java Wed Jul 05 19:46:31 2017 +0200
@@ -78,7 +78,7 @@
", errorCode=" + packet.errorCode +
", flags=" + packet.flags);
}
- StringBuffer line = new StringBuffer(80);
+ StringBuilder line = new StringBuilder(80);
line.append("0000: ");
for (int i = 0; i < packet.data.length; i++) {
if ((i > 0) && (i % 16 == 0)) {
--- a/jdk/src/share/classes/com/sun/tools/jdi/VirtualMachineImpl.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/com/sun/tools/jdi/VirtualMachineImpl.java Wed Jul 05 19:46:31 2017 +0200
@@ -742,7 +742,7 @@
}
void printReceiveTrace(int depth, String string) {
- StringBuffer sb = new StringBuffer("Receiving:");
+ StringBuilder sb = new StringBuilder("Receiving:");
for (int i = depth; i > 0; --i) {
sb.append(" ");
}
@@ -872,7 +872,7 @@
ReferenceTypeImpl referenceType(long id, int tag,
String signature) {
if ((vm.traceFlags & VirtualMachine.TRACE_REFTYPES) != 0) {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
sb.append("Looking up ");
if (tag == JDWP.TypeTag.CLASS) {
sb.append("Class");
--- a/jdk/src/share/classes/java/beans/Introspector.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/java/beans/Introspector.java Wed Jul 05 19:46:31 2017 +0200
@@ -1282,7 +1282,7 @@
* Creates a key for a method in a method cache.
*/
private static String makeQualifiedMethodName(String name, String[] params) {
- StringBuffer sb = new StringBuffer(name);
+ StringBuilder sb = new StringBuilder(name);
sb.append('=');
for (int i = 0; i < params.length; i++) {
sb.append(':');
--- a/jdk/src/share/classes/java/beans/Statement.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/java/beans/Statement.java Wed Jul 05 19:46:31 2017 +0200
@@ -340,7 +340,7 @@
if (arguments == null) {
arguments = emptyArray;
}
- StringBuffer result = new StringBuffer(instanceName(target) + "." + methodName + "(");
+ StringBuilder result = new StringBuilder(instanceName(target) + "." + methodName + "(");
int n = arguments.length;
for(int i = 0; i < n; i++) {
result.append(instanceName(arguments[i]));
--- a/jdk/src/share/classes/java/io/RandomAccessFile.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/java/io/RandomAccessFile.java Wed Jul 05 19:46:31 2017 +0200
@@ -890,7 +890,7 @@
*/
public final String readLine() throws IOException {
- StringBuffer input = new StringBuffer();
+ StringBuilder input = new StringBuilder();
int c = -1;
boolean eol = false;
--- a/jdk/src/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java Wed Jul 05 19:46:31 2017 +0200
@@ -40,6 +40,7 @@
import static java.lang.invoke.MethodHandleNatives.Constants.*;
import static java.lang.invoke.LambdaForm.BasicType.*;
import sun.invoke.util.VerifyType;
+import sun.reflect.misc.ReflectUtil;
/**
* Code generation backend for LambdaForm.
@@ -594,6 +595,8 @@
return false; // inner class of some sort
if (cls.getClassLoader() != MethodHandle.class.getClassLoader())
return false; // not on BCP
+ if (ReflectUtil.isVMAnonymousClass(cls)) // FIXME: switch to supported API once it is added
+ return false;
MethodType mtype = member.getMethodOrFieldType();
if (!isStaticallyNameable(mtype.returnType()))
return false;
@@ -612,6 +615,8 @@
cls = cls.getComponentType();
if (cls.isPrimitive())
return true; // int[].class, for example
+ if (ReflectUtil.isVMAnonymousClass(cls)) // FIXME: switch to supported API once it is added
+ return false;
// could use VerifyAccess.isClassAccessible but the following is a safe approximation
if (cls.getClassLoader() != Object.class.getClassLoader())
return false;
--- a/jdk/src/share/classes/java/net/IDN.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/java/net/IDN.java Wed Jul 05 19:46:31 2017 +0200
@@ -111,7 +111,7 @@
public static String toASCII(String input, int flag)
{
int p = 0, q = 0;
- StringBuffer out = new StringBuffer();
+ StringBuilder out = new StringBuilder();
if (isRootLabel(input)) {
return ".";
@@ -172,7 +172,7 @@
*/
public static String toUnicode(String input, int flag) {
int p = 0, q = 0;
- StringBuffer out = new StringBuffer();
+ StringBuilder out = new StringBuilder();
if (isRootLabel(input)) {
return ".";
--- a/jdk/src/share/classes/java/net/SocketPermission.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/java/net/SocketPermission.java Wed Jul 05 19:46:31 2017 +0200
@@ -733,7 +733,7 @@
InetAddress auth;
try {
- StringBuffer sb = new StringBuffer(39);
+ StringBuilder sb = new StringBuilder(39);
for (int i = 15; i >= 0; i--) {
sb.append(Integer.toHexString(((addr[i]) & 0x0f)));
--- a/jdk/src/share/classes/java/net/URI.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/java/net/URI.java Wed Jul 05 19:46:31 2017 +0200
@@ -1957,7 +1957,7 @@
private void defineString() {
if (string != null) return;
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
if (scheme != null) {
sb.append(scheme);
sb.append(':');
@@ -2015,7 +2015,7 @@
if (i >= 0)
path = base.substring(0, i + 1);
} else {
- StringBuffer sb = new StringBuffer(base.length() + cn);
+ StringBuilder sb = new StringBuilder(base.length() + cn);
// 5.2 (6a)
if (i >= 0)
sb.append(base.substring(0, i + 1));
@@ -2778,7 +2778,7 @@
if (s.indexOf('%') < 0)
return s;
- StringBuffer sb = new StringBuffer(n);
+ StringBuilder sb = new StringBuilder(n);
ByteBuffer bb = ByteBuffer.allocate(n);
CharBuffer cb = CharBuffer.allocate(n);
CharsetDecoder dec = ThreadLocalCoders.decoderFor("UTF-8")
--- a/jdk/src/share/classes/java/net/URISyntaxException.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/java/net/URISyntaxException.java Wed Jul 05 19:46:31 2017 +0200
@@ -121,7 +121,7 @@
* @return A string describing the parse error
*/
public String getMessage() {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
sb.append(getReason());
if (index > -1) {
sb.append(" at index ");
--- a/jdk/src/share/classes/java/net/URLDecoder.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/java/net/URLDecoder.java Wed Jul 05 19:46:31 2017 +0200
@@ -134,7 +134,7 @@
boolean needToChange = false;
int numChars = s.length();
- StringBuffer sb = new StringBuffer(numChars > 500 ? numChars / 2 : numChars);
+ StringBuilder sb = new StringBuilder(numChars > 500 ? numChars / 2 : numChars);
int i = 0;
if (enc.length() == 0) {
--- a/jdk/src/share/classes/java/net/URLEncoder.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/java/net/URLEncoder.java Wed Jul 05 19:46:31 2017 +0200
@@ -201,7 +201,7 @@
throws UnsupportedEncodingException {
boolean needToChange = false;
- StringBuffer out = new StringBuffer(s.length());
+ StringBuilder out = new StringBuilder(s.length());
Charset charset;
CharArrayWriter charArrayWriter = new CharArrayWriter();
--- a/jdk/src/share/classes/java/net/URLStreamHandler.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/java/net/URLStreamHandler.java Wed Jul 05 19:46:31 2017 +0200
@@ -486,7 +486,7 @@
if (u.getRef() != null)
len += 1 + u.getRef().length();
- StringBuffer result = new StringBuffer(len);
+ StringBuilder result = new StringBuilder(len);
result.append(u.getProtocol());
result.append(":");
if (u.getAuthority() != null && u.getAuthority().length() > 0) {
--- a/jdk/src/share/classes/java/nio/file/InvalidPathException.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/java/nio/file/InvalidPathException.java Wed Jul 05 19:46:31 2017 +0200
@@ -117,7 +117,7 @@
* @return a string describing the error
*/
public String getMessage() {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
sb.append(getReason());
if (index > -1) {
sb.append(" at index ");
--- a/jdk/src/share/classes/java/rmi/dgc/VMID.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/java/rmi/dgc/VMID.java Wed Jul 05 19:46:31 2017 +0200
@@ -120,15 +120,15 @@
* Return string representation of this VMID.
*/
public String toString() {
- StringBuffer result = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
if (addr != null)
for (int i = 0; i < addr.length; ++ i) {
int x = addr[i] & 0xFF;
- result.append((x < 0x10 ? "0" : "") +
- Integer.toString(x, 16));
+ sb.append((x < 0x10 ? "0" : "") +
+ Integer.toString(x, 16));
}
- result.append(':');
- result.append(uid.toString());
- return result.toString();
+ sb.append(':');
+ sb.append(uid.toString());
+ return sb.toString();
}
}
--- a/jdk/src/share/classes/java/security/CodeSigner.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/java/security/CodeSigner.java Wed Jul 05 19:46:31 2017 +0200
@@ -154,7 +154,7 @@
* if present.
*/
public String toString() {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
sb.append("(");
sb.append("Signer: " + signerCertPath.getCertificates().get(0));
if (timestamp != null) {
--- a/jdk/src/share/classes/java/security/Timestamp.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/java/security/Timestamp.java Wed Jul 05 19:46:31 2017 +0200
@@ -141,7 +141,7 @@
* its signer's certificate.
*/
public String toString() {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
sb.append("(");
sb.append("timestamp: " + timestamp);
List<? extends Certificate> certs = signerCertPath.getCertificates();
--- a/jdk/src/share/classes/java/security/cert/CertPath.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/java/security/cert/CertPath.java Wed Jul 05 19:46:31 2017 +0200
@@ -220,7 +220,7 @@
* @return a string representation of this certification path
*/
public String toString() {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
Iterator<? extends Certificate> stringIterator =
getCertificates().iterator();
--- a/jdk/src/share/classes/java/security/cert/CollectionCertStoreParameters.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/java/security/cert/CollectionCertStoreParameters.java Wed Jul 05 19:46:31 2017 +0200
@@ -132,7 +132,7 @@
* @return a formatted string describing the parameters
*/
public String toString() {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
sb.append("CollectionCertStoreParameters: [\n");
sb.append(" collection: " + coll + "\n");
sb.append("]");
--- a/jdk/src/share/classes/java/security/cert/LDAPCertStoreParameters.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/java/security/cert/LDAPCertStoreParameters.java Wed Jul 05 19:46:31 2017 +0200
@@ -138,7 +138,7 @@
* @return a formatted string describing the parameters
*/
public String toString() {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
sb.append("LDAPCertStoreParameters: [\n");
sb.append(" serverName: " + serverName + "\n");
--- a/jdk/src/share/classes/java/security/cert/PKIXBuilderParameters.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/java/security/cert/PKIXBuilderParameters.java Wed Jul 05 19:46:31 2017 +0200
@@ -189,7 +189,7 @@
* @return a formatted string describing the parameters
*/
public String toString() {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
sb.append("[\n");
sb.append(super.toString());
sb.append(" Maximum Path Length: " + maxPathLength + "\n");
--- a/jdk/src/share/classes/java/security/cert/PKIXCertPathBuilderResult.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/java/security/cert/PKIXCertPathBuilderResult.java Wed Jul 05 19:46:31 2017 +0200
@@ -107,7 +107,7 @@
* {@code PKIXCertPathBuilderResult}
*/
public String toString() {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
sb.append("PKIXCertPathBuilderResult: [\n");
sb.append(" Certification Path: " + certPath + "\n");
sb.append(" Trust Anchor: " + getTrustAnchor().toString() + "\n");
--- a/jdk/src/share/classes/java/security/cert/PKIXCertPathValidatorResult.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/java/security/cert/PKIXCertPathValidatorResult.java Wed Jul 05 19:46:31 2017 +0200
@@ -148,7 +148,7 @@
* {@code PKIXCertPathValidatorResult}
*/
public String toString() {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
sb.append("PKIXCertPathValidatorResult: [\n");
sb.append(" Trust Anchor: " + trustAnchor.toString() + "\n");
sb.append(" Policy Tree: " + String.valueOf(policyTree) + "\n");
--- a/jdk/src/share/classes/java/security/cert/PKIXParameters.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/java/security/cert/PKIXParameters.java Wed Jul 05 19:46:31 2017 +0200
@@ -693,7 +693,7 @@
* @return a formatted string describing the parameters.
*/
public String toString() {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
sb.append("[\n");
/* start with trusted anchor info */
--- a/jdk/src/share/classes/java/security/cert/PolicyQualifierInfo.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/java/security/cert/PolicyQualifierInfo.java Wed Jul 05 19:46:31 2017 +0200
@@ -161,7 +161,7 @@
if (pqiString != null)
return pqiString;
HexDumpEncoder enc = new HexDumpEncoder();
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
sb.append("PolicyQualifierInfo: [\n");
sb.append(" qualifierID: " + mId + "\n");
sb.append(" qualifier: " +
--- a/jdk/src/share/classes/java/security/cert/TrustAnchor.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/java/security/cert/TrustAnchor.java Wed Jul 05 19:46:31 2017 +0200
@@ -317,7 +317,7 @@
* @return a formatted string describing the {@code TrustAnchor}
*/
public String toString() {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
sb.append("[\n");
if (pubKey != null) {
sb.append(" Trusted CA Public Key: " + pubKey.toString() + "\n");
--- a/jdk/src/share/classes/java/security/cert/X509CRLSelector.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/java/security/cert/X509CRLSelector.java Wed Jul 05 19:46:31 2017 +0200
@@ -566,7 +566,7 @@
* {@code X509CRLSelector}.
*/
public String toString() {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
sb.append("X509CRLSelector: [\n");
if (issuerNames != null) {
sb.append(" IssuerNames:\n");
--- a/jdk/src/share/classes/java/security/cert/X509CertSelector.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/java/security/cert/X509CertSelector.java Wed Jul 05 19:46:31 2017 +0200
@@ -1811,7 +1811,7 @@
* {@code CertSelector}
*/
public String toString() {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
sb.append("X509CertSelector: [\n");
if (x509Cert != null) {
sb.append(" Certificate: " + x509Cert.toString() + "\n");
--- a/jdk/src/share/classes/java/text/AttributedString.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/java/text/AttributedString.java Wed Jul 05 19:46:31 2017 +0200
@@ -243,11 +243,11 @@
throw new IllegalArgumentException("Invalid substring range");
// Copy the given string
- StringBuffer textBuffer = new StringBuffer();
+ StringBuilder textBuilder = new StringBuilder();
text.setIndex(beginIndex);
for (char c = text.current(); text.getIndex() < endIndex; c = text.next())
- textBuffer.append(c);
- this.text = textBuffer.toString();
+ textBuilder.append(c);
+ this.text = textBuilder.toString();
if (beginIndex == endIndex)
return;
--- a/jdk/src/share/classes/java/text/ChoiceFormat.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/java/text/ChoiceFormat.java Wed Jul 05 19:46:31 2017 +0200
@@ -259,7 +259,7 @@
* @return the pattern string
*/
public String toPattern() {
- StringBuffer result = new StringBuffer();
+ StringBuilder result = new StringBuilder();
for (int i = 0; i < choiceLimits.length; ++i) {
if (i != 0) {
result.append('|');
--- a/jdk/src/share/classes/java/time/Instant.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/java/time/Instant.java Wed Jul 05 19:46:31 2017 +0200
@@ -375,7 +375,7 @@
return Instant.ofEpochSecond(instantSecs, nanoOfSecond);
} catch (DateTimeException ex) {
throw new DateTimeException("Unable to obtain Instant from TemporalAccessor: " +
- temporal + " of type " + temporal.getClass().getName());
+ temporal + " of type " + temporal.getClass().getName(), ex);
}
}
@@ -1058,7 +1058,8 @@
}
// inline TemporalAccessor.super.query(query) as an optimization
if (query == TemporalQueries.chronology() || query == TemporalQueries.zoneId() ||
- query == TemporalQueries.zone() || query == TemporalQueries.offset()) {
+ query == TemporalQueries.zone() || query == TemporalQueries.offset() ||
+ query == TemporalQueries.localDate() || query == TemporalQueries.localTime()) {
return null;
}
return query.queryFrom(this);
--- a/jdk/src/share/classes/java/time/OffsetDateTime.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/java/time/OffsetDateTime.java Wed Jul 05 19:46:31 2017 +0200
@@ -357,10 +357,11 @@
}
try {
ZoneOffset offset = ZoneOffset.from(temporal);
- try {
- LocalDateTime ldt = LocalDateTime.from(temporal);
- return OffsetDateTime.of(ldt, offset);
- } catch (DateTimeException ignore) {
+ LocalDate date = temporal.query(TemporalQueries.localDate());
+ LocalTime time = temporal.query(TemporalQueries.localTime());
+ if (date != null && time != null) {
+ return OffsetDateTime.of(date, time, offset);
+ } else {
Instant instant = Instant.from(temporal);
return OffsetDateTime.ofInstant(instant, offset);
}
--- a/jdk/src/share/classes/java/time/ZonedDateTime.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/java/time/ZonedDateTime.java Wed Jul 05 19:46:31 2017 +0200
@@ -81,6 +81,7 @@
import java.time.temporal.TemporalAdjuster;
import java.time.temporal.TemporalAmount;
import java.time.temporal.TemporalField;
+import java.time.temporal.TemporalQueries;
import java.time.temporal.TemporalQuery;
import java.time.temporal.TemporalUnit;
import java.time.temporal.UnsupportedTemporalTypeException;
@@ -551,14 +552,14 @@
}
try {
ZoneId zone = ZoneId.from(temporal);
- try {
+ if (temporal.isSupported(INSTANT_SECONDS)) {
long epochSecond = temporal.getLong(INSTANT_SECONDS);
int nanoOfSecond = temporal.get(NANO_OF_SECOND);
return create(epochSecond, nanoOfSecond, zone);
-
- } catch (DateTimeException ex1) {
- LocalDateTime ldt = LocalDateTime.from(temporal);
- return of(ldt, zone);
+ } else {
+ LocalDate date = LocalDate.from(temporal);
+ LocalTime time = LocalTime.from(temporal);
+ return of(date, time, zone);
}
} catch (DateTimeException ex) {
throw new DateTimeException("Unable to obtain ZonedDateTime from TemporalAccessor: " +
@@ -2039,8 +2040,12 @@
* @throws DateTimeException if unable to query (defined by the query)
* @throws ArithmeticException if numeric overflow occurs (defined by the query)
*/
+ @SuppressWarnings("unchecked")
@Override // override for Javadoc
public <R> R query(TemporalQuery<R> query) {
+ if (query == TemporalQueries.localDate()) {
+ return (R) toLocalDate();
+ }
return ChronoZonedDateTime.super.query(query);
}
--- a/jdk/src/share/classes/java/time/format/DateTimeFormatterBuilder.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/java/time/format/DateTimeFormatterBuilder.java Wed Jul 05 19:46:31 2017 +0200
@@ -3283,7 +3283,7 @@
} catch (RuntimeException ex) {
return ~position;
}
- int successPos = text.length();
+ int successPos = pos;
successPos = context.setParsedField(INSTANT_SECONDS, instantSecs, position, successPos);
return context.setParsedField(NANO_OF_SECOND, nano, position, successPos);
}
--- a/jdk/src/share/classes/java/time/format/Parsed.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/java/time/format/Parsed.java Wed Jul 05 19:46:31 2017 +0200
@@ -66,6 +66,7 @@
import static java.time.temporal.ChronoField.CLOCK_HOUR_OF_DAY;
import static java.time.temporal.ChronoField.HOUR_OF_AMPM;
import static java.time.temporal.ChronoField.HOUR_OF_DAY;
+import static java.time.temporal.ChronoField.INSTANT_SECONDS;
import static java.time.temporal.ChronoField.MICRO_OF_DAY;
import static java.time.temporal.ChronoField.MICRO_OF_SECOND;
import static java.time.temporal.ChronoField.MILLI_OF_DAY;
@@ -74,14 +75,17 @@
import static java.time.temporal.ChronoField.MINUTE_OF_HOUR;
import static java.time.temporal.ChronoField.NANO_OF_DAY;
import static java.time.temporal.ChronoField.NANO_OF_SECOND;
+import static java.time.temporal.ChronoField.OFFSET_SECONDS;
import static java.time.temporal.ChronoField.SECOND_OF_DAY;
import static java.time.temporal.ChronoField.SECOND_OF_MINUTE;
import java.time.DateTimeException;
+import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.Period;
import java.time.ZoneId;
+import java.time.ZoneOffset;
import java.time.chrono.ChronoLocalDate;
import java.time.chrono.ChronoLocalDateTime;
import java.time.chrono.ChronoZonedDateTime;
@@ -241,12 +245,15 @@
resolveTimeLenient();
crossCheck();
resolvePeriod();
+ resolveFractional();
+ resolveInstant();
return this;
}
//-----------------------------------------------------------------------
private void resolveFields() {
// resolve ChronoField
+ resolveInstantFields();
resolveDateFields();
resolveTimeFields();
@@ -300,6 +307,7 @@
}
// if something changed then have to redo ChronoField resolve
if (changedCount > 0) {
+ resolveInstantFields();
resolveDateFields();
resolveTimeFields();
}
@@ -316,6 +324,29 @@
}
//-----------------------------------------------------------------------
+ private void resolveInstantFields() {
+ // resolve parsed instant seconds to date and time if zone available
+ if (fieldValues.containsKey(INSTANT_SECONDS)) {
+ if (zone != null) {
+ resolveInstantFields0(zone);
+ } else {
+ Long offsetSecs = fieldValues.get(OFFSET_SECONDS);
+ if (offsetSecs != null) {
+ ZoneOffset offset = ZoneOffset.ofTotalSeconds(offsetSecs.intValue());
+ resolveInstantFields0(offset);
+ }
+ }
+ }
+ }
+
+ private void resolveInstantFields0(ZoneId selectedZone) {
+ Instant instant = Instant.ofEpochSecond(fieldValues.remove(INSTANT_SECONDS));
+ ChronoZonedDateTime<?> zdt = chrono.zonedDateTime(instant, selectedZone);
+ updateCheckConflict(zdt.toLocalDate());
+ updateCheckConflict(INSTANT_SECONDS, SECOND_OF_DAY, (long) zdt.toLocalTime().toSecondOfDay());
+ }
+
+ //-----------------------------------------------------------------------
private void resolveDateFields() {
updateCheckConflict(chrono.resolveDate(fieldValues, resolverStyle));
}
@@ -533,6 +564,42 @@
}
}
+ private void resolveFractional() {
+ // ensure fractional seconds available as ChronoField requires
+ // resolveTimeLenient() will have merged MICRO_OF_SECOND/MILLI_OF_SECOND to NANO_OF_SECOND
+ if (time == null &&
+ (fieldValues.containsKey(INSTANT_SECONDS) ||
+ fieldValues.containsKey(SECOND_OF_DAY) ||
+ fieldValues.containsKey(SECOND_OF_MINUTE))) {
+ if (fieldValues.containsKey(NANO_OF_SECOND)) {
+ long nos = fieldValues.get(NANO_OF_SECOND);
+ fieldValues.put(MICRO_OF_SECOND, nos / 1000);
+ fieldValues.put(MILLI_OF_SECOND, nos / 1000000);
+ } else {
+ fieldValues.put(NANO_OF_SECOND, 0L);
+ fieldValues.put(MICRO_OF_SECOND, 0L);
+ fieldValues.put(MILLI_OF_SECOND, 0L);
+ }
+ }
+ }
+
+ private void resolveInstant() {
+ // add instant seconds if we have date, time and zone
+ if (date != null && time != null) {
+ if (zone != null) {
+ long instant = date.atTime(time).atZone(zone).getLong(ChronoField.INSTANT_SECONDS);
+ fieldValues.put(INSTANT_SECONDS, instant);
+ } else {
+ Long offsetSecs = fieldValues.get(OFFSET_SECONDS);
+ if (offsetSecs != null) {
+ ZoneOffset offset = ZoneOffset.ofTotalSeconds(offsetSecs.intValue());
+ long instant = date.atTime(time).atZone(offset).getLong(ChronoField.INSTANT_SECONDS);
+ fieldValues.put(INSTANT_SECONDS, instant);
+ }
+ }
+ }
+ }
+
private void updateCheckConflict(LocalTime timeToSet, Period periodToSet) {
if (time != null) {
if (time.equals(timeToSet) == false) {
@@ -568,18 +635,20 @@
for (Iterator<Entry<TemporalField, Long>> it = fieldValues.entrySet().iterator(); it.hasNext(); ) {
Entry<TemporalField, Long> entry = it.next();
TemporalField field = entry.getKey();
- long val1;
- try {
- val1 = target.getLong(field);
- } catch (RuntimeException ex) {
- continue;
+ if (target.isSupported(field)) {
+ long val1;
+ try {
+ val1 = target.getLong(field);
+ } catch (RuntimeException ex) {
+ continue;
+ }
+ long val2 = entry.getValue();
+ if (val1 != val2) {
+ throw new DateTimeException("Conflict found: Field " + field + " " + val1 +
+ " differs from " + field + " " + val2 + " derived from " + target);
+ }
+ it.remove();
}
- long val2 = entry.getValue();
- if (val1 != val2) {
- throw new DateTimeException("Conflict found: Field " + field + " " + val1 +
- " differs from " + field + " " + val2 + " derived from " + target);
- }
- it.remove();
}
}
--- a/jdk/src/share/classes/java/util/Properties.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/java/util/Properties.java Wed Jul 05 19:46:31 2017 +0200
@@ -602,7 +602,7 @@
if (bufLen < 0) {
bufLen = Integer.MAX_VALUE;
}
- StringBuffer outBuffer = new StringBuffer(bufLen);
+ StringBuilder outBuffer = new StringBuilder(bufLen);
for(int x=0; x<len; x++) {
char aChar = theString.charAt(x);
--- a/jdk/src/share/classes/java/util/concurrent/ConcurrentHashMap.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/java/util/concurrent/ConcurrentHashMap.java Wed Jul 05 19:46:31 2017 +0200
@@ -133,12 +133,12 @@
* mapped values are (perhaps transiently) not used or all take the
* same mapping value.
*
- * <p>A ConcurrentHashMap can be used as scalable frequency map (a
+ * <p>A ConcurrentHashMap can be used as a scalable frequency map (a
* form of histogram or multiset) by using {@link
* java.util.concurrent.atomic.LongAdder} values and initializing via
* {@link #computeIfAbsent computeIfAbsent}. For example, to add a count
* to a {@code ConcurrentHashMap<String,LongAdder> freqs}, you can use
- * {@code freqs.computeIfAbsent(k -> new LongAdder()).increment();}
+ * {@code freqs.computeIfAbsent(key, k -> new LongAdder()).increment();}
*
* <p>This class and its views and iterators implement all of the
* <em>optional</em> methods of the {@link Map} and {@link Iterator}
--- a/jdk/src/share/classes/java/util/concurrent/atomic/LongAdder.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/java/util/concurrent/atomic/LongAdder.java Wed Jul 05 19:46:31 2017 +0200
@@ -57,7 +57,7 @@
* frequency map (a form of histogram or multiset). For example, to
* add a count to a {@code ConcurrentHashMap<String,LongAdder> freqs},
* initializing if not already present, you can use {@code
- * freqs.computeIfAbsent(k -> new LongAdder()).increment();}
+ * freqs.computeIfAbsent(key, k -> new LongAdder()).increment();}
*
* <p>This class extends {@link Number}, but does <em>not</em> define
* methods such as {@code equals}, {@code hashCode} and {@code
--- a/jdk/src/share/classes/java/util/prefs/Base64.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/java/util/prefs/Base64.java Wed Jul 05 19:46:31 2017 +0200
@@ -57,7 +57,7 @@
int numFullGroups = aLen/3;
int numBytesInPartialGroup = aLen - 3*numFullGroups;
int resultLen = 4*((aLen + 2)/3);
- StringBuffer result = new StringBuffer(resultLen);
+ StringBuilder result = new StringBuilder(resultLen);
char[] intToAlpha = (alternate ? intToAltBase64 : intToBase64);
// Translate all full groups from byte array elements to Base64
--- a/jdk/src/share/classes/java/util/regex/PatternSyntaxException.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/java/util/regex/PatternSyntaxException.java Wed Jul 05 19:46:31 2017 +0200
@@ -105,7 +105,7 @@
* @return The full detail message
*/
public String getMessage() {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
sb.append(desc);
if (index >= 0) {
sb.append(" near index ");
--- a/jdk/src/share/classes/javax/imageio/stream/ImageInputStreamImpl.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/imageio/stream/ImageInputStreamImpl.java Wed Jul 05 19:46:31 2017 +0200
@@ -289,7 +289,7 @@
}
public String readLine() throws IOException {
- StringBuffer input = new StringBuffer();
+ StringBuilder input = new StringBuilder();
int c = -1;
boolean eol = false;
--- a/jdk/src/share/classes/javax/naming/BinaryRefAddr.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/naming/BinaryRefAddr.java Wed Jul 05 19:46:31 2017 +0200
@@ -165,7 +165,7 @@
* @return The non-null string representation of this address.
*/
public String toString(){
- StringBuffer str = new StringBuffer("Address Type: " + addrType + "\n");
+ StringBuilder str = new StringBuilder("Address Type: " + addrType + "\n");
str.append("AddressContents: ");
for (int i = 0; i<buf.length && i < 32; i++) {
--- a/jdk/src/share/classes/javax/naming/NameImpl.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/naming/NameImpl.java Wed Jul 05 19:46:31 2017 +0200
@@ -104,7 +104,7 @@
String endQuote;
boolean start = true;
boolean one = false;
- StringBuffer answer = new StringBuffer(len);
+ StringBuilder answer = new StringBuilder(len);
while (i < len) {
// handle quoted strings
--- a/jdk/src/share/classes/javax/naming/RefAddr.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/naming/RefAddr.java Wed Jul 05 19:46:31 2017 +0200
@@ -139,7 +139,7 @@
* @return The non-null string representation of this address.
*/
public String toString(){
- StringBuffer str = new StringBuffer("Type: " + addrType + "\n");
+ StringBuilder str = new StringBuilder("Type: " + addrType + "\n");
str.append("Content: " + getContent() + "\n");
return (str.toString());
--- a/jdk/src/share/classes/javax/naming/Reference.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/naming/Reference.java Wed Jul 05 19:46:31 2017 +0200
@@ -364,13 +364,13 @@
* @return The non-null string representation of this reference.
*/
public String toString() {
- StringBuffer buf = new StringBuffer("Reference Class Name: " +
- className + "\n");
+ StringBuilder sb = new StringBuilder("Reference Class Name: " +
+ className + "\n");
int len = addrs.size();
for (int i = 0; i < len; i++)
- buf.append(get(i).toString());
+ sb.append(get(i).toString());
- return buf.toString();
+ return sb.toString();
}
/**
--- a/jdk/src/share/classes/javax/naming/directory/BasicAttribute.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/naming/directory/BasicAttribute.java Wed Jul 05 19:46:31 2017 +0200
@@ -211,7 +211,7 @@
* @return The non-null string representation of this attribute.
*/
public String toString() {
- StringBuffer answer = new StringBuffer(attrID + ": ");
+ StringBuilder answer = new StringBuilder(attrID + ": ");
if (values.size() == 0) {
answer.append("No values");
} else {
--- a/jdk/src/share/classes/javax/print/MimeType.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/print/MimeType.java Wed Jul 05 19:46:31 2017 +0200
@@ -285,7 +285,7 @@
*/
private String getStringValue() {
if (myStringValue == null) {
- StringBuffer result = new StringBuffer();
+ StringBuilder result = new StringBuilder();
result.append (myPieces[0]);
result.append ('/');
result.append (myPieces[1]);
@@ -510,7 +510,7 @@
int n = s.length();
int i;
char c;
- StringBuffer result = new StringBuffer (n+2);
+ StringBuilder result = new StringBuilder (n+2);
result.append ('\"');
for (i = 0; i < n; ++ i) {
c = s.charAt (i);
--- a/jdk/src/share/classes/javax/print/attribute/ResolutionSyntax.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/print/attribute/ResolutionSyntax.java Wed Jul 05 19:46:31 2017 +0200
@@ -241,7 +241,7 @@
* (unchecked exception) Thrown if {@code units < 1}.
*/
public String toString(int units, String unitsName) {
- StringBuffer result = new StringBuffer();
+ StringBuilder result = new StringBuilder();
result.append(getCrossFeedResolution (units));
result.append('x');
result.append(getFeedResolution (units));
@@ -326,7 +326,7 @@
* resolution. The values are reported in the internal units of dphi.
*/
public String toString() {
- StringBuffer result = new StringBuffer();
+ StringBuilder result = new StringBuilder();
result.append(crossFeedResolution);
result.append('x');
result.append(feedResolution);
--- a/jdk/src/share/classes/javax/print/attribute/SetOfIntegerSyntax.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/print/attribute/SetOfIntegerSyntax.java Wed Jul 05 19:46:31 2017 +0200
@@ -540,7 +540,7 @@
* <CODE>"<I>i</I>-<I>j</I>"</CODE> otherwise.
*/
public String toString() {
- StringBuffer result = new StringBuffer();
+ StringBuilder result = new StringBuilder();
int n = members.length;
for (int i = 0; i < n; i++) {
if (i > 0) {
--- a/jdk/src/share/classes/javax/print/attribute/Size2DSyntax.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/print/attribute/Size2DSyntax.java Wed Jul 05 19:46:31 2017 +0200
@@ -257,7 +257,7 @@
* (unchecked exception) Thrown if {@code units < 1}.
*/
public String toString(int units, String unitsName) {
- StringBuffer result = new StringBuffer();
+ StringBuilder result = new StringBuilder();
result.append(getX (units));
result.append('x');
result.append(getY (units));
@@ -312,7 +312,7 @@
* The values are reported in the internal units of micrometers.
*/
public String toString() {
- StringBuffer result = new StringBuffer();
+ StringBuilder result = new StringBuilder();
result.append(x);
result.append('x');
result.append(y);
--- a/jdk/src/share/classes/javax/security/auth/kerberos/KerberosTicket.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/security/auth/kerberos/KerberosTicket.java Wed Jul 05 19:46:31 2017 +0200
@@ -636,11 +636,11 @@
public String toString() {
if (destroyed)
throw new IllegalStateException("This ticket is no longer valid");
- StringBuffer caddrBuf = new StringBuffer();
+ StringBuilder caddrString = new StringBuilder();
if (clientAddresses != null) {
for (int i = 0; i < clientAddresses.length; i++) {
- caddrBuf.append("clientAddresses[" + i + "] = " +
- clientAddresses[i].toString());
+ caddrString.append("clientAddresses[" + i + "] = " +
+ clientAddresses[i].toString());
}
}
return ("Ticket (hex) = " + "\n" +
@@ -660,7 +660,7 @@
"End Time = " + endTime.toString() + "\n" +
"Renew Till = " + String.valueOf(renewTill) + "\n" +
"Client Addresses " +
- (clientAddresses == null ? " Null " : caddrBuf.toString() +
+ (clientAddresses == null ? " Null " : caddrString.toString() +
"\n"));
}
--- a/jdk/src/share/classes/javax/sound/sampled/CompoundControl.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/sound/sampled/CompoundControl.java Wed Jul 05 19:46:31 2017 +0200
@@ -94,18 +94,18 @@
*/
public String toString() {
- StringBuffer buf = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
for (int i = 0; i < controls.length; i++) {
if (i != 0) {
- buf.append(", ");
+ sb.append(", ");
if ((i + 1) == controls.length) {
- buf.append("and ");
+ sb.append("and ");
}
}
- buf.append(controls[i].getType());
+ sb.append(controls[i].getType());
}
- return new String(getType() + " Control containing " + buf + " Controls.");
+ return new String(getType() + " Control containing " + sb + " Controls.");
}
--- a/jdk/src/share/classes/javax/sound/sampled/DataLine.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/sound/sampled/DataLine.java Wed Jul 05 19:46:31 2017 +0200
@@ -471,23 +471,23 @@
*/
public String toString() {
- StringBuffer buf = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
if ( (formats.length == 1) && (formats[0] != null) ) {
- buf.append(" supporting format " + formats[0]);
+ sb.append(" supporting format " + formats[0]);
} else if (getFormats().length > 1) {
- buf.append(" supporting " + getFormats().length + " audio formats");
+ sb.append(" supporting " + getFormats().length + " audio formats");
}
if ( (minBufferSize != AudioSystem.NOT_SPECIFIED) && (maxBufferSize != AudioSystem.NOT_SPECIFIED) ) {
- buf.append(", and buffers of " + minBufferSize + " to " + maxBufferSize + " bytes");
+ sb.append(", and buffers of " + minBufferSize + " to " + maxBufferSize + " bytes");
} else if ( (minBufferSize != AudioSystem.NOT_SPECIFIED) && (minBufferSize > 0) ) {
- buf.append(", and buffers of at least " + minBufferSize + " bytes");
+ sb.append(", and buffers of at least " + minBufferSize + " bytes");
} else if (maxBufferSize != AudioSystem.NOT_SPECIFIED) {
- buf.append(", and buffers of up to " + minBufferSize + " bytes");
+ sb.append(", and buffers of up to " + minBufferSize + " bytes");
}
- return new String(super.toString() + buf);
+ return new String(super.toString() + sb);
}
} // class Info
--- a/jdk/src/share/classes/javax/sql/CommonDataSource.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/sql/CommonDataSource.java Wed Jul 05 19:46:31 2017 +0200
@@ -34,6 +34,7 @@
* Interface that defines the methods which are common between <code>DataSource</code>,
* <code>XADataSource</code> and <code>ConnectionPoolDataSource</code>.
*
+ * @since 1.6
*/
public interface CommonDataSource {
--- a/jdk/src/share/classes/javax/sql/rowset/BaseRowSet.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/sql/rowset/BaseRowSet.java Wed Jul 05 19:46:31 2017 +0200
@@ -291,6 +291,8 @@
* extending class overrides and reimplements any <code>BaseRowSet</code> method and encounters
* connectivity or underlying data source issues, that method <b>may</b> in addition throw an
* <code>SQLException</code> object for that reason.
+*
+* @since 1.5
*/
public abstract class BaseRowSet implements Serializable, Cloneable {
--- a/jdk/src/share/classes/javax/sql/rowset/CachedRowSet.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/sql/rowset/CachedRowSet.java Wed Jul 05 19:46:31 2017 +0200
@@ -626,6 +626,7 @@
* </PRE>
*
* @author Jonathan Bruce
+ * @since 1.5
*/
public interface CachedRowSet extends RowSet, Joinable {
--- a/jdk/src/share/classes/javax/sql/rowset/FilteredRowSet.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/sql/rowset/FilteredRowSet.java Wed Jul 05 19:46:31 2017 +0200
@@ -122,6 +122,7 @@
* synchronized with the data source.
*
* @author Jonathan Bruce
+ * @since 1.5
*/
public interface FilteredRowSet extends WebRowSet {
--- a/jdk/src/share/classes/javax/sql/rowset/JdbcRowSet.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/sql/rowset/JdbcRowSet.java Wed Jul 05 19:46:31 2017 +0200
@@ -118,6 +118,7 @@
* requirements of connected and disconnected <code>RowSet</code> objects.
*
* @author Jonathan Bruce
+ * @since 1.5
*/
public interface JdbcRowSet extends RowSet, Joinable {
--- a/jdk/src/share/classes/javax/sql/rowset/JoinRowSet.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/sql/rowset/JoinRowSet.java Wed Jul 05 19:46:31 2017 +0200
@@ -217,6 +217,7 @@
* This method creates a copy that can be persisted to the data source.
* </UL>
*
+ * @since 1.5
*/
public interface JoinRowSet extends WebRowSet {
--- a/jdk/src/share/classes/javax/sql/rowset/Joinable.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/sql/rowset/Joinable.java Wed Jul 05 19:46:31 2017 +0200
@@ -129,6 +129,7 @@
*
* @see JoinRowSet
* @author Jonathan Bruce
+ * @since 1.5
*/
public interface Joinable {
--- a/jdk/src/share/classes/javax/sql/rowset/Predicate.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/sql/rowset/Predicate.java Wed Jul 05 19:46:31 2017 +0200
@@ -97,6 +97,7 @@
* applications that use both column identification conventions.
*
* @author Jonathan Bruce, Amit Handa
+ * @since 1.5
*
*/
--- a/jdk/src/share/classes/javax/sql/rowset/RowSetMetaDataImpl.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/sql/rowset/RowSetMetaDataImpl.java Wed Jul 05 19:46:31 2017 +0200
@@ -48,6 +48,8 @@
* Therefore, any <code>RowSetMetaDataImpl</code> method that retrieves information
* is defined as having unspecified behavior when it is called
* before the <code>RowSet</code> object contains data.
+ *
+ * @since 1.5
*/
public class RowSetMetaDataImpl implements RowSetMetaData, Serializable {
--- a/jdk/src/share/classes/javax/sql/rowset/RowSetWarning.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/sql/rowset/RowSetWarning.java Wed Jul 05 19:46:31 2017 +0200
@@ -50,6 +50,8 @@
* The inherited methods <code>getMessage</code>, <code>getSQLState</code>,
* and <code>getErrorCode</code> retrieve information contained in a
* <code>RowSetWarning</code> object.
+ *
+ * @since 1.5
*/
public class RowSetWarning extends SQLException {
--- a/jdk/src/share/classes/javax/sql/rowset/WebRowSet.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/sql/rowset/WebRowSet.java Wed Jul 05 19:46:31 2017 +0200
@@ -408,6 +408,7 @@
* @see javax.sql.rowset.CachedRowSet
* @see javax.sql.rowset.FilteredRowSet
* @see javax.sql.rowset.JoinRowSet
+ * @since 1.5
*/
public interface WebRowSet extends CachedRowSet {
--- a/jdk/src/share/classes/javax/sql/rowset/serial/SQLOutputImpl.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/sql/rowset/serial/SQLOutputImpl.java Wed Jul 05 19:46:31 2017 +0200
@@ -52,6 +52,8 @@
* to write data from the <code>SQLData</code> object to
* the <code>SQLOutputImpl</code> output stream as the
* representation of an SQL user-defined type.
+ *
+ * @since 1.5
*/
public class SQLOutputImpl implements SQLOutput {
--- a/jdk/src/share/classes/javax/sql/rowset/serial/SerialArray.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/sql/rowset/serial/SerialArray.java Wed Jul 05 19:46:31 2017 +0200
@@ -56,6 +56,7 @@
* SerialArray is to be used by more than one thread then access to the
* SerialArray should be controlled by appropriate synchronization.
*
+ * @since 1.5
*/
public class SerialArray implements Array, Serializable, Cloneable {
--- a/jdk/src/share/classes/javax/sql/rowset/serial/SerialBlob.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/sql/rowset/serial/SerialBlob.java Wed Jul 05 19:46:31 2017 +0200
@@ -58,6 +58,7 @@
* should be controlled by appropriate synchronization.
*
* @author Jonathan Bruce
+ * @since 1.5
*/
public class SerialBlob implements Blob, Serializable, Cloneable {
--- a/jdk/src/share/classes/javax/sql/rowset/serial/SerialClob.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/sql/rowset/serial/SerialClob.java Wed Jul 05 19:46:31 2017 +0200
@@ -49,7 +49,9 @@
* <p> A SerialClob is not safe for use by multiple concurrent threads. If a
* SerialClob is to be used by more than one thread then access to the SerialClob
* should be controlled by appropriate synchronization.
+ *
* @author Jonathan Bruce
+ * @since 1.5
*/
public class SerialClob implements Clob, Serializable, Cloneable {
--- a/jdk/src/share/classes/javax/sql/rowset/serial/SerialDatalink.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/sql/rowset/serial/SerialDatalink.java Wed Jul 05 19:46:31 2017 +0200
@@ -48,6 +48,8 @@
* A SerialDatalink is not safe for use by multiple concurrent threads. If a
* SerialDatalink is to be used by more than one thread then access to the
* SerialDatalink should be controlled by appropriate synchronization.
+ *
+ * @since 1.5
*/
public class SerialDatalink implements Serializable, Cloneable {
--- a/jdk/src/share/classes/javax/sql/rowset/serial/SerialException.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/sql/rowset/serial/SerialException.java Wed Jul 05 19:46:31 2017 +0200
@@ -32,6 +32,7 @@
* SQL types such as <code>BLOB, CLOB, STRUCT or ARRAY</code> in
* addition to SQL types such as <code>DATALINK and JAVAOBJECT</code>
*
+ * @since 1.5
*/
public class SerialException extends java.sql.SQLException {
--- a/jdk/src/share/classes/javax/sql/rowset/serial/SerialJavaObject.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/sql/rowset/serial/SerialJavaObject.java Wed Jul 05 19:46:31 2017 +0200
@@ -54,6 +54,7 @@
* SerialJavaObject should be controlled by appropriate synchronization.
*
* @author Jonathan Bruce
+ * @since 1.5
*/
public class SerialJavaObject implements Serializable, Cloneable {
--- a/jdk/src/share/classes/javax/sql/rowset/serial/SerialRef.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/sql/rowset/serial/SerialRef.java Wed Jul 05 19:46:31 2017 +0200
@@ -43,6 +43,7 @@
* SerialRef is to be used by more than one thread then access to the SerialRef
* should be controlled by appropriate synchronization.
*
+ * @since 1.5
*/
public class SerialRef implements Ref, Serializable, Cloneable {
--- a/jdk/src/share/classes/javax/sql/rowset/serial/SerialStruct.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/sql/rowset/serial/SerialStruct.java Wed Jul 05 19:46:31 2017 +0200
@@ -57,6 +57,7 @@
* SerialStruct is to be used by more than one thread then access to the
* SerialStruct should be controlled by appropriate synchronization.
*
+ * @since 1.5
*/
public class SerialStruct implements Struct, Serializable, Cloneable {
--- a/jdk/src/share/classes/javax/sql/rowset/spi/SyncFactory.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/sql/rowset/spi/SyncFactory.java Wed Jul 05 19:46:31 2017 +0200
@@ -200,6 +200,7 @@
* @author Jonathan Bruce
* @see javax.sql.rowset.spi.SyncProvider
* @see javax.sql.rowset.spi.SyncFactoryException
+ * @since 1.5
*/
public class SyncFactory {
--- a/jdk/src/share/classes/javax/sql/rowset/spi/SyncFactoryException.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/sql/rowset/spi/SyncFactoryException.java Wed Jul 05 19:46:31 2017 +0200
@@ -35,6 +35,7 @@
* @author Jonathan Bruce
* @see javax.sql.rowset.spi.SyncFactory
* @see javax.sql.rowset.spi.SyncFactoryException
+ * @since 1.5
*/
public class SyncFactoryException extends java.sql.SQLException {
--- a/jdk/src/share/classes/javax/sql/rowset/spi/SyncProvider.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/sql/rowset/spi/SyncProvider.java Wed Jul 05 19:46:31 2017 +0200
@@ -209,6 +209,7 @@
* @author Jonathan Bruce
* @see javax.sql.rowset.spi.SyncFactory
* @see javax.sql.rowset.spi.SyncFactoryException
+ * @since 1.5
*/
public abstract class SyncProvider {
--- a/jdk/src/share/classes/javax/sql/rowset/spi/SyncProviderException.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/sql/rowset/spi/SyncProviderException.java Wed Jul 05 19:46:31 2017 +0200
@@ -61,6 +61,7 @@
* @see javax.sql.rowset.spi.SyncFactory
* @see javax.sql.rowset.spi.SyncResolver
* @see javax.sql.rowset.spi.SyncFactoryException
+ * @since 1.5
*/
public class SyncProviderException extends java.sql.SQLException {
--- a/jdk/src/share/classes/javax/sql/rowset/spi/SyncResolver.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/sql/rowset/spi/SyncResolver.java Wed Jul 05 19:46:31 2017 +0200
@@ -231,7 +231,9 @@
* }
* }
* }</PRE>
+ *
* @author Jonathan Bruce
+ * @since 1.5
*/
public interface SyncResolver extends RowSet {
--- a/jdk/src/share/classes/javax/sql/rowset/spi/TransactionalWriter.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/sql/rowset/spi/TransactionalWriter.java Wed Jul 05 19:46:31 2017 +0200
@@ -44,6 +44,8 @@
* the <code>CachedRowSet</code> constant <code>COMMIT_ON_ACCEPT_CHANGES</code>
* to <code>false</code> and use the <code>commit</code> and <code>rollback</code>
* methods defined in this interface to manage transaction boundaries.
+ *
+ * @since 1.5
*/
public interface TransactionalWriter extends RowSetWriter {
--- a/jdk/src/share/classes/javax/sql/rowset/spi/XmlReader.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/sql/rowset/spi/XmlReader.java Wed Jul 05 19:46:31 2017 +0200
@@ -46,6 +46,8 @@
* rowset's <code>xmlReader</code> field. When the <code>WebRowSet</code>
* object's <code>readXml</code> method is invoked, it in turn invokes
* its XML reader's <code>readXML</code> method.
+ *
+ * @since 1.5
*/
public interface XmlReader extends RowSetReader {
--- a/jdk/src/share/classes/javax/sql/rowset/spi/XmlWriter.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/sql/rowset/spi/XmlWriter.java Wed Jul 05 19:46:31 2017 +0200
@@ -44,6 +44,8 @@
* Writing a <code>WebRowSet</code> object includes printing the
* rowset's data, metadata, and properties, all with the
* appropriate XML tags.
+ *
+ * @since 1.5
*/
public interface XmlWriter extends RowSetWriter {
--- a/jdk/src/share/classes/javax/swing/AbstractButton.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/swing/AbstractButton.java Wed Jul 05 19:46:31 2017 +0200
@@ -947,6 +947,7 @@
* <p>
* This is a JavaBeans bound property.
*
+ * @param iconTextGap the space between icon and text if these properties are set.
* @since 1.4
* @see #getIconTextGap
* @beaninfo
@@ -1337,6 +1338,7 @@
* that of the <code>Action</code>.
*
* @param a the button's action
+ * @return the {@code PropertyChangeListener}
* @since 1.3
* @see Action
* @see #setAction
@@ -2070,12 +2072,20 @@
}
}
-
+ /**
+ * Returns {@code ActionListener} that is added to model.
+ *
+ * @return the {@code ActionListener}
+ */
protected ActionListener createActionListener() {
return getHandler();
}
-
+ /**
+ * Returns {@code ItemListener} that is added to model.
+ *
+ * @return the {@code ItemListener}
+ */
protected ItemListener createItemListener() {
return getHandler();
}
@@ -2148,7 +2158,7 @@
return listenerList.getListeners(ItemListener.class);
}
- /**
+ /**
* Returns an array (length 1) containing the label or
* <code>null</code> if the button is not selected.
*
@@ -2164,6 +2174,12 @@
return selectedObjects;
}
+ /**
+ * Initialization of the {@code AbstractButton}.
+ *
+ * @param text the text of the button
+ * @param icon the Icon image to display on the button
+ */
protected void init(String text, Icon icon) {
if(text != null) {
setText(text);
--- a/jdk/src/share/classes/javax/swing/AbstractSpinnerModel.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/swing/AbstractSpinnerModel.java Wed Jul 05 19:46:31 2017 +0200
@@ -131,6 +131,7 @@
* myAbstractSpinnerModel.getListeners(ChangeListener.class);
* </pre>
*
+ * @param <T> the type of requested listeners
* @param listenerType the type of listeners to return, e.g. ChangeListener.class
* @return all of the objects receiving <em>listenerType</em> notifications
* from this model
--- a/jdk/src/share/classes/javax/swing/Action.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/swing/Action.java Wed Jul 05 19:46:31 2017 +0200
@@ -337,6 +337,9 @@
/**
* Gets one of this object's properties
* using the associated key.
+ *
+ * @param key a {@code String} containing the key
+ * @return the {@code Object} value
* @see #putValue
*/
public Object getValue(String key);
--- a/jdk/src/share/classes/javax/swing/ActionMap.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/swing/ActionMap.java Wed Jul 05 19:46:31 2017 +0200
@@ -94,6 +94,9 @@
* for <code>key</code>.
* <p>In most instances, <code>key</code> will be
* <code>action.getValue(NAME)</code>.
+ *
+ * @param key a key
+ * @param action a binding for {@code key}
*/
public void put(Object key, Action action) {
if (key == null) {
@@ -113,6 +116,9 @@
/**
* Returns the binding for <code>key</code>, messaging the
* parent <code>ActionMap</code> if the binding is not locally defined.
+ *
+ * @param key a key
+ * @return the binding for {@code key}
*/
public Action get(Object key) {
Action value = (arrayTable == null) ? null :
@@ -130,6 +136,8 @@
/**
* Removes the binding for <code>key</code> from this <code>ActionMap</code>.
+ *
+ * @param key a key
*/
public void remove(Object key) {
if (arrayTable != null) {
@@ -148,6 +156,8 @@
/**
* Returns the <code>Action</code> names that are bound in this <code>ActionMap</code>.
+ *
+ * @return an array of the keys
*/
public Object[] keys() {
if (arrayTable == null) {
@@ -172,6 +182,8 @@
* Returns an array of the keys defined in this <code>ActionMap</code> and
* its parent. This method differs from <code>keys()</code> in that
* this method includes the keys defined in the parent.
+ *
+ * @return an array of the keys
*/
public Object[] allKeys() {
int count = size();
--- a/jdk/src/share/classes/javax/swing/ButtonGroup.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/swing/ButtonGroup.java Wed Jul 05 19:46:31 2017 +0200
@@ -167,9 +167,11 @@
}
/**
- * Returns whether a <code>ButtonModel</code> is selected.
- * @return <code>true</code> if the button is selected,
- * otherwise returns <code>false</code>
+ * Returns whether a {@code ButtonModel} is selected.
+ *
+ * @param m an isntance of {@code ButtonModel}
+ * @return {@code true} if the button is selected,
+ * otherwise returns {@code false}
*/
public boolean isSelected(ButtonModel m) {
return (m == selection);
--- a/jdk/src/share/classes/javax/swing/ComboBoxEditor.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/swing/ComboBoxEditor.java Wed Jul 05 19:46:31 2017 +0200
@@ -34,23 +34,44 @@
*/
public interface ComboBoxEditor {
- /** Return the component that should be added to the tree hierarchy for
- * this editor
- */
+ /**
+ * Returns the component that should be added to the tree hierarchy for
+ * this editor
+ *
+ * @return the component
+ */
public Component getEditorComponent();
- /** Set the item that should be edited. Cancel any editing if necessary **/
+ /**
+ * Set the item that should be edited. Cancel any editing if necessary
+ *
+ * @param anObject an item
+ */
public void setItem(Object anObject);
- /** Return the edited item **/
+ /**
+ * Returns the edited item
+ *
+ * @return the edited item
+ */
public Object getItem();
- /** Ask the editor to start editing and to select everything **/
+ /**
+ * Ask the editor to start editing and to select everything
+ */
public void selectAll();
- /** Add an ActionListener. An action event is generated when the edited item changes **/
+ /**
+ * Add an ActionListener. An action event is generated when the edited item changes
+ *
+ * @param l an {@code ActionListener}
+ */
public void addActionListener(ActionListener l);
- /** Remove an ActionListener **/
+ /**
+ * Remove an ActionListener
+ *
+ * @param l an {@code ActionListener}
+ */
public void removeActionListener(ActionListener l);
}
--- a/jdk/src/share/classes/javax/swing/ComponentInputMap.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/swing/ComponentInputMap.java Wed Jul 05 19:46:31 2017 +0200
@@ -78,7 +78,9 @@
}
/**
- * Returns the component the <code>InputMap</code> was created for.
+ * Returns the component the {@code InputMap} was created for.
+ *
+ * @return the component the {@code InputMap} was created for.
*/
public JComponent getComponent() {
return component;
--- a/jdk/src/share/classes/javax/swing/DefaultButtonModel.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/swing/DefaultButtonModel.java Wed Jul 05 19:46:31 2017 +0200
@@ -477,6 +477,7 @@
* If no such listeners exist,
* this method returns an empty array.
*
+ * @param <T> the type of requested listeners
* @param listenerType the type of listeners requested;
* this parameter should specify an interface
* that descends from <code>java.util.EventListener</code>
--- a/jdk/src/share/classes/javax/swing/FocusManager.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/swing/FocusManager.java Wed Jul 05 19:46:31 2017 +0200
@@ -140,6 +140,7 @@
* Returns whether the application has invoked
* <code>disableSwingFocusManager()</code>.
*
+ * @return {@code true} if focus manager is enabled.
* @see #disableSwingFocusManager
* @deprecated As of 1.4, replaced by
* <code>KeyboardFocusManager.getDefaultFocusTraversalPolicy()</code>
--- a/jdk/src/share/classes/javax/swing/GroupLayout.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/swing/GroupLayout.java Wed Jul 05 19:46:31 2017 +0200
@@ -670,6 +670,7 @@
* @param resizable whether the group is resizable
* @param anchorBaselineToTop whether the baseline is anchored to
* the top or bottom of the group
+ * @return the {@code ParallelGroup}
* @see #createBaselineGroup
* @see ParallelGroup
*/
--- a/jdk/src/share/classes/javax/swing/JColorChooser.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/swing/JColorChooser.java Wed Jul 05 19:46:31 2017 +0200
@@ -542,7 +542,7 @@
* @return a string representation of this <code>JColorChooser</code>
*/
protected String paramString() {
- StringBuffer chooserPanelsString = new StringBuffer("");
+ StringBuilder chooserPanelsString = new StringBuilder("");
for (int i=0; i<chooserPanels.length; i++) {
chooserPanelsString.append("[" + chooserPanels[i].toString()
+ "]");
--- a/jdk/src/share/classes/javax/swing/JComboBox.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/swing/JComboBox.java Wed Jul 05 19:46:31 2017 +0200
@@ -232,6 +232,13 @@
updateUI();
}
+ /**
+ * Registers ancestor listener so that it will receive
+ * {@code AncestorEvents} when it or any of its ancestors
+ * move or are made visible or invisible.
+ * Events are also sent when the component or its ancestors are added
+ * or removed from the containment hierarchy.
+ */
protected void installAncestorListener() {
addAncestorListener(new AncestorListener(){
public void ancestorAdded(AncestorEvent event){ hidePopup();}
@@ -812,6 +819,8 @@
/**
* Sets the visibility of the popup.
+ *
+ * @param v if {@code true} shows the popup, otherwise, hides the popup.
*/
public void setPopupVisible(boolean v) {
getUI().setPopupVisible(this, v);
@@ -1144,6 +1153,7 @@
* that of the <code>Action</code>.
*
* @param a the combobox's action
+ * @return the {@code PropertyChangeListener}
* @since 1.3
* @see Action
* @see #setAction
@@ -1357,6 +1367,8 @@
*
* @param keyChar a char, typically this is a keyboard key
* typed by the user
+ * @return {@code true} if there is an item corresponding to that character.
+ * Otherwise, returns {@code false}.
*/
public boolean selectWithKeyChar(char keyChar) {
int index;
@@ -1443,6 +1455,7 @@
* selection. Typically, the first selection with a matching first
* character becomes the selected item.
*
+ * @param aManager a key selection manager
* @beaninfo
* expert: true
* description: The objects that changes the selection when a key is pressed.
--- a/jdk/src/share/classes/javax/swing/JOptionPane.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/swing/JOptionPane.java Wed Jul 05 19:46:31 2017 +0200
@@ -435,6 +435,7 @@
* @exception HeadlessException if
* <code>GraphicsEnvironment.isHeadless</code> returns
* <code>true</code>
+ * @return user's input
* @see java.awt.GraphicsEnvironment#isHeadless
*/
public static String showInputDialog(Object message)
@@ -451,6 +452,7 @@
* @param message the <code>Object</code> to display
* @param initialSelectionValue the value used to initialize the input
* field
+ * @return user's input
* @since 1.4
*/
public static String showInputDialog(Object message, Object initialSelectionValue) {
@@ -469,6 +471,7 @@
* @exception HeadlessException if
* <code>GraphicsEnvironment.isHeadless</code> returns
* <code>true</code>
+ * @return user's input
* @see java.awt.GraphicsEnvironment#isHeadless
*/
public static String showInputDialog(Component parentComponent,
@@ -489,6 +492,7 @@
* @param message the <code>Object</code> to display
* @param initialSelectionValue the value used to initialize the input
* field
+ * @return user's input
* @since 1.4
*/
public static String showInputDialog(Component parentComponent, Object message,
@@ -515,6 +519,7 @@
* <code>WARNING_MESSAGE</code>,
* <code>QUESTION_MESSAGE</code>,
* or <code>PLAIN_MESSAGE</code>
+ * @return user's input
* @exception HeadlessException if
* <code>GraphicsEnvironment.isHeadless</code> returns
* <code>true</code>
@@ -1348,6 +1353,7 @@
* @param parentComponent the parent <code>Component</code>
* for the dialog
* @param message the <code>Object</code> to display
+ * @return user's input
*/
public static String showInternalInputDialog(Component parentComponent,
Object message) {
@@ -1368,6 +1374,7 @@
* @param messageType the type of message that is to be displayed:
* ERROR_MESSAGE, INFORMATION_MESSAGE, WARNING_MESSAGE,
* QUESTION_MESSAGE, or PLAIN_MESSAGE
+ * @return user's input
*/
public static String showInternalInputDialog(Component parentComponent,
Object message, String title, int messageType) {
@@ -2246,6 +2253,8 @@
* <p>
* This is a bound property.
*
+ * @param newValue if true, an input component whose parent is {@code parentComponent}
+ * is provided to allow the user to input a value.
* @see #setSelectionValues
* @see #setInputValue
* @beaninfo
--- a/jdk/src/share/classes/javax/swing/JProgressBar.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/swing/JProgressBar.java Wed Jul 05 19:46:31 2017 +0200
@@ -665,6 +665,7 @@
* to the {@code ChangeListener}s that have been added directly to the
* progress bar.
*
+ * @return the instance of a custom {@code ChangeListener} implementation.
* @see #changeListener
* @see #fireStateChanged
* @see javax.swing.event.ChangeListener
--- a/jdk/src/share/classes/javax/swing/JRadioButton.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/swing/JRadioButton.java Wed Jul 05 19:46:31 2017 +0200
@@ -118,6 +118,7 @@
* Creates a radiobutton where properties are taken from the
* Action supplied.
*
+ * @param a an {@code Action}
* @since 1.3
*/
public JRadioButton(Action a) {
@@ -175,6 +176,8 @@
*
* @param text the string displayed on the radio button
* @param icon the image that the button should display
+ * @param selected if {@code true}, the button is initially selected
+ * otherwise, the button is initially unselected
*/
public JRadioButton (String text, Icon icon, boolean selected) {
super(text, icon, selected);
--- a/jdk/src/share/classes/javax/swing/JRadioButtonMenuItem.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/swing/JRadioButtonMenuItem.java Wed Jul 05 19:46:31 2017 +0200
@@ -173,6 +173,8 @@
*
* @param text the string displayed on the radio button
* @param icon the image that the button should display
+ * @param selected if {@code true}, the button is initially selected,
+ * otherwise, the button is initially unselected
*/
public JRadioButtonMenuItem(String text, Icon icon, boolean selected) {
super(text, icon);
--- a/jdk/src/share/classes/javax/swing/JScrollBar.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/swing/JScrollBar.java Wed Jul 05 19:46:31 2017 +0200
@@ -149,6 +149,12 @@
* @see #setVisibleAmount
* @see #setMinimum
* @see #setMaximum
+ *
+ * @param orientation an orientation of the {@code JScrollBar}
+ * @param value an int giving the current value
+ * @param extent an int giving the amount by which the value can "jump"
+ * @param min an int giving the minimum value
+ * @param max an int giving the maximum value
*/
public JScrollBar(int orientation, int value, int extent, int min, int max)
{
@@ -172,6 +178,8 @@
* value = 0
* extent = 10
* </pre>
+ *
+ * @param orientation an orientation of the {@code JScrollBar}
*/
public JScrollBar(int orientation) {
this(orientation, 0, 10, 0, 100);
@@ -213,6 +221,7 @@
* Returns the delegate that implements the look and feel for
* this component.
*
+ * @return the scroll bar's current UI.
* @see JComponent#setUI
*/
public ScrollBarUI getUI() {
@@ -258,6 +267,7 @@
* Set the scrollbar's orientation to either VERTICAL or
* HORIZONTAL.
*
+ * @param orientation an orientation of the {@code JScrollBar}
* @exception IllegalArgumentException if orientation is not one of VERTICAL, HORIZONTAL
* @see #getOrientation
* @beaninfo
@@ -293,6 +303,8 @@
* Returns data model that handles the scrollbar's four
* fundamental properties: minimum, maximum, value, extent.
*
+ * @return the data model
+ *
* @see #setModel
*/
public BoundedRangeModel getModel() {
@@ -304,6 +316,7 @@
* Sets the model that handles the scrollbar's four
* fundamental properties: minimum, maximum, value, extent.
*
+ * @param newModel a new model
* @see #getModel
* @beaninfo
* bound: true
@@ -583,6 +596,8 @@
* scrollbar model will not generate ChangeEvents while
* valueIsAdjusting is true.
*
+ * @param b {@code true} if the upcoming changes to the value property are part of a series
+ *
* @see #getValueIsAdjusting
* @see BoundedRangeModel#setValueIsAdjusting
* @beaninfo
@@ -610,6 +625,10 @@
* minimum ≤ value ≤ value+extent ≤ maximum
* </pre>
*
+ * @param newValue an int giving the current value
+ * @param newExtent an int giving the amount by which the value can "jump"
+ * @param newMin an int giving the minimum value
+ * @param newMax an int giving the maximum value
*
* @see BoundedRangeModel#setRangeProperties
* @see #setValue
@@ -681,6 +700,10 @@
/**
* Notify listeners that the scrollbar's model has changed.
*
+ * @param id an integer indicating the type of event.
+ * @param type an integer indicating the adjustment type.
+ * @param value the current value of the adjustment
+ *
* @see #addAdjustmentListener
* @see EventListenerList
*/
--- a/jdk/src/share/classes/javax/swing/JToggleButton.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/swing/JToggleButton.java Wed Jul 05 19:46:31 2017 +0200
@@ -140,6 +140,7 @@
* Creates a toggle button where properties are taken from the
* Action supplied.
*
+ * @param a an instance of an {@code Action}
* @since 1.3
*/
public JToggleButton(Action a) {
@@ -390,6 +391,9 @@
protected class AccessibleJToggleButton extends AccessibleAbstractButton
implements ItemListener {
+ /**
+ * Constructs {@code AccessibleJToggleButton}
+ */
public AccessibleJToggleButton() {
super();
JToggleButton.this.addItemListener(this);
--- a/jdk/src/share/classes/javax/swing/JToolBar.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/swing/JToolBar.java Wed Jul 05 19:46:31 2017 +0200
@@ -161,6 +161,8 @@
/**
* Returns the tool bar's current UI.
+ *
+ * @return the tool bar's current UI.
* @see #setUI
*/
public ToolBarUI getUI() {
@@ -555,7 +557,8 @@
* or <code>null</code> if the default
* property change listener for the control is desired.
*
- * @return <code>null</code>
+ * @param b a {@code JButton}
+ * @return {@code null}
*/
protected PropertyChangeListener createActionChangeListener(JButton b) {
return null;
--- a/jdk/src/share/classes/javax/swing/JTree.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/swing/JTree.java Wed Jul 05 19:46:31 2017 +0200
@@ -986,6 +986,7 @@
* or equal to 0 the height for each row is determined by the
* renderer.
*
+ * @return the height of each row
*/
public int getRowHeight()
{
@@ -1115,6 +1116,7 @@
* <p>
* This is a bound property.
*
+ * @param clickCount the number of mouse clicks to get a node expanded or closed
* @since 1.3
* @beaninfo
* bound: true
@@ -1508,6 +1510,7 @@
* is provided as an entry point for subclassers to add filtered
* editing without having to resort to creating a new editor.
*
+ * @param path a {@code TreePath} identifying a node
* @return true if every parent node and the node itself is editable
* @see #isEditable
*/
@@ -1984,6 +1987,8 @@
/**
* Returns true if the node identified by the path has ever been
* expanded.
+ *
+ * @param path a {@code TreePath} identifying a node
* @return true if the <code>path</code> has ever been expanded
*/
public boolean hasBeenExpanded(TreePath path) {
@@ -2079,6 +2084,7 @@
* which means it is either the root or all of its parents are expanded.
* Otherwise, this method returns false.
*
+ * @param path {@code TreePath} identifying a node
* @return true if the node is viewable, otherwise false
*/
public boolean isVisible(TreePath path) {
@@ -2472,6 +2478,7 @@
* set the selection model to <code>null</code>, which forces an empty
* selection model to be used.
*
+ * @return the model for selections
* @see #setSelectionModel
*/
public TreeSelectionModel getSelectionModel() {
@@ -2817,6 +2824,7 @@
*
* @param path the <code>TreePath</code> indicating the node that was
* expanded
+ * @throws ExpandVetoException if the expansion is prevented from occurring
* @see EventListenerList
*/
public void fireTreeWillExpand(TreePath path) throws ExpandVetoException {
@@ -2843,6 +2851,7 @@
*
* @param path the <code>TreePath</code> indicating the node that was
* expanded
+ * @throws ExpandVetoException if the collapse is prevented from occurring
* @see EventListenerList
*/
public void fireTreeWillCollapse(TreePath path) throws ExpandVetoException {
@@ -3541,6 +3550,11 @@
* <code>path</code> are marked EXPANDED, but <code>path</code> itself
* is marked collapsed.<p>
* This will fail if a <code>TreeWillExpandListener</code> vetos it.
+ *
+ * @param path a {@code TreePath} identifying a node
+ * @param state if {@code true}, all parents of @{code path} and path are marked as expanded.
+ * Otherwise, all parents of {@code path} are marked EXPANDED,
+ * but {@code path} itself is marked collapsed.
*/
protected void setExpandedState(TreePath path, boolean state) {
if(path != null) {
@@ -3636,9 +3650,12 @@
}
/**
- * Returns an <code>Enumeration</code> of <code>TreePaths</code>
+ * Returns an {@code Enumeration} of {@code TreePaths}
* that have been expanded that
- * are descendants of <code>parent</code>.
+ * are descendants of {@code parent}.
+ *
+ * @param parent a path
+ * @return the {@code Enumeration} of {@code TreePaths}
*/
protected Enumeration<TreePath>
getDescendantToggledPaths(TreePath parent)
@@ -3701,6 +3718,8 @@
* <p>
* For more information on what expanded state means, see the
* <a href=#jtree_description>JTree description</a> above.
+ *
+ * @return the instance of {@code TreeModelHandler}
*/
protected TreeModelListener createTreeModelListener() {
return new TreeModelHandler();
@@ -3711,6 +3730,9 @@
* <code>path</code>. If <code>includePath</code> is true and
* <code>path</code> is selected, it will be removed from the selection.
*
+ * @param path a path
+ * @param includePath is {@code true} and {@code path} is selected,
+ * it will be removed from the selection.
* @return true if a descendant was selected
* @since 1.3
*/
@@ -3891,6 +3913,9 @@
* elements are added is children, otherwise if <code>children</code>
* is a hashtable all the key/value pairs are added in the order
* <code>Enumeration</code> returns them.
+ *
+ * @param parent the parent node
+ * @param children the children
*/
public static void createChildren(DefaultMutableTreeNode parent,
Object children) {
@@ -4113,6 +4138,9 @@
TreePath leadSelectionPath;
Accessible leadSelectionAccessible;
+ /**
+ * Constructs {@code AccessibleJTree}
+ */
public AccessibleJTree() {
// Add a tree model listener for JTree
TreeModel model = JTree.this.getModel();
@@ -4551,7 +4579,11 @@
private boolean isLeaf = false;
/**
- * Constructs an AccessibleJTreeNode
+ * Constructs an AccessibleJTreeNode
+ *
+ * @param t an instance of {@code JTree}
+ * @param p an instance of {@code TreePath}
+ * @param ap an instance of {@code Accessible}
* @since 1.4
*/
public AccessibleJTreeNode(JTree t, TreePath p, Accessible ap) {
@@ -5183,6 +5215,11 @@
}
}
+ /**
+ * Returns the relative location of the node
+ *
+ * @return the relative location of the node
+ */
protected Point getLocationInJTree() {
Rectangle r = tree.getPathBounds(path);
if (r != null) {
--- a/jdk/src/share/classes/javax/swing/ListSelectionModel.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/swing/ListSelectionModel.java Wed Jul 05 19:46:31 2017 +0200
@@ -134,18 +134,25 @@
/**
* Returns the first selected index or -1 if the selection is empty.
+ *
+ * @return the first selected index or -1 if the selection is empty.
*/
int getMinSelectionIndex();
/**
* Returns the last selected index or -1 if the selection is empty.
+ *
+ * @return the last selected index or -1 if the selection is empty.
*/
int getMaxSelectionIndex();
/**
* Returns true if the specified index is selected.
+ *
+ * @param index an index
+ * @return {@code true} if the specified index is selected
*/
boolean isSelectedIndex(int index);
@@ -158,6 +165,7 @@
* indices specially, e.g. Windows95 displays the lead index with a
* dotted yellow outline.
*
+ * @return the anchor selection index
* @see #getLeadSelectionIndex
* @see #setSelectionInterval
* @see #addSelectionInterval
@@ -168,6 +176,7 @@
/**
* Set the anchor selection index.
*
+ * @param index the anchor selection index
* @see #getAnchorSelectionIndex
*/
void setAnchorSelectionIndex(int index);
@@ -177,6 +186,7 @@
* Return the second index argument from the most recent call to
* setSelectionInterval(), addSelectionInterval() or removeSelectionInterval().
*
+ * @return the lead selection index.
* @see #getAnchorSelectionIndex
* @see #setSelectionInterval
* @see #addSelectionInterval
@@ -186,6 +196,7 @@
/**
* Set the lead selection index.
*
+ * @param index the lead selection index
* @see #getLeadSelectionIndex
*/
void setLeadSelectionIndex(int index);
@@ -200,20 +211,30 @@
/**
* Returns true if no indices are selected.
+ *
+ * @return {@code true} if no indices are selected.
*/
boolean isSelectionEmpty();
/**
- * Insert length indices beginning before/after index. This is typically
+ * Insert {@code length} indices beginning before/after {@code index}. This is typically
* called to sync the selection model with a corresponding change
* in the data model.
+ *
+ * @param index the beginning of the interval
+ * @param length the length of the interval
+ * @param before if {@code true}, interval inserts before the {@code index},
+ * otherwise, interval inserts after the {@code index}
*/
void insertIndexInterval(int index, int length, boolean before);
/**
- * Remove the indices in the interval index0,index1 (inclusive) from
+ * Remove the indices in the interval {@code index0,index1} (inclusive) from
* the selection model. This is typically called to sync the selection
* model width a corresponding change in the data model.
+ *
+ * @param index0 the beginning of the interval
+ * @param index1 the end of the interval
*/
void removeIndexInterval(int index0, int index1);
@@ -272,6 +293,7 @@
* In this mode, there's no restriction on what can be selected.
* </ul>
*
+ * @param selectionMode the selection mode
* @see #getSelectionMode
* @throws IllegalArgumentException if the selection mode isn't
* one of those allowed
--- a/jdk/src/share/classes/javax/swing/MultiUIDefaults.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/swing/MultiUIDefaults.java Wed Jul 05 19:46:31 2017 +0200
@@ -190,18 +190,18 @@
@Override
public synchronized String toString() {
- StringBuffer buf = new StringBuffer();
- buf.append("{");
+ StringBuilder sb = new StringBuilder();
+ sb.append("{");
Enumeration keys = keys();
while (keys.hasMoreElements()) {
Object key = keys.nextElement();
- buf.append(key + "=" + get(key) + ", ");
+ sb.append(key + "=" + get(key) + ", ");
}
- int length = buf.length();
+ int length = sb.length();
if (length > 1) {
- buf.delete(length-2, length);
+ sb.delete(length-2, length);
}
- buf.append("}");
- return buf.toString();
+ sb.append("}");
+ return sb.toString();
}
}
--- a/jdk/src/share/classes/javax/swing/RepaintManager.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/swing/RepaintManager.java Wed Jul 05 19:46:31 2017 +0200
@@ -331,6 +331,7 @@
* for the event dispatching thread that will validate the components
* first isValidateRoot() ancestor.
*
+ * @param invalidComponent a component
* @see JComponent#isValidateRoot
* @see #removeInvalidComponent
*/
@@ -374,6 +375,7 @@
/**
* Remove a component from the list of invalid components.
*
+ * @param component a component
* @see #addInvalidComponent
*/
public synchronized void removeInvalidComponent(JComponent component) {
@@ -610,9 +612,13 @@
return false;
}
- /** Return the current dirty region for a component.
- * Return an empty rectangle if the component is not
- * dirty.
+ /**
+ * Return the current dirty region for a component.
+ * Return an empty rectangle if the component is not
+ * dirty.
+ *
+ * @param aComponent a component
+ * @return the region
*/
public Rectangle getDirtyRegion(JComponent aComponent) {
RepaintManager delegate = getDelegate(aComponent);
@@ -632,6 +638,8 @@
/**
* Mark a component completely dirty. <b>aComponent</b> will be
* completely painted during the next paintDirtyRegions() call.
+ *
+ * @param aComponent a component
*/
public void markCompletelyDirty(JComponent aComponent) {
RepaintManager delegate = getDelegate(aComponent);
@@ -645,6 +653,8 @@
/**
* Mark a component completely clean. <b>aComponent</b> will not
* get painted during the next paintDirtyRegions() call.
+ *
+ * @param aComponent a component
*/
public void markCompletelyClean(JComponent aComponent) {
RepaintManager delegate = getDelegate(aComponent);
@@ -662,6 +672,10 @@
* painted during the next paintDirtyRegions(). If computing dirty regions is
* expensive for your component, use this method and avoid computing dirty region
* if it return true.
+ *
+ * @param aComponent a component
+ * @return {@code true} if <b>aComponent</b> will be completely
+ * painted during the next paintDirtyRegions().
*/
public boolean isCompletelyDirty(JComponent aComponent) {
RepaintManager delegate = getDelegate(aComponent);
@@ -975,20 +989,26 @@
* @return a String representation of this object
*/
public synchronized String toString() {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
if(dirtyComponents != null)
sb.append("" + dirtyComponents);
return sb.toString();
}
- /**
+ /**
* Return the offscreen buffer that should be used as a double buffer with
* the component <code>c</code>.
* By default there is a double buffer per RepaintManager.
* The buffer might be smaller than <code>(proposedWidth,proposedHeight)</code>
* This happens when the maximum double buffer size as been set for the receiving
* repaint manager.
+ *
+ * @param c the component
+ * @param proposedWidth the width of the buffer
+ * @param proposedHeight the height of the buffer
+ *
+ * @return the image
*/
public Image getOffscreenBuffer(Component c,int proposedWidth,int proposedHeight) {
RepaintManager delegate = getDelegate(c);
@@ -998,18 +1018,23 @@
return _getOffscreenBuffer(c, proposedWidth, proposedHeight);
}
- /**
- * Return a volatile offscreen buffer that should be used as a
- * double buffer with the specified component <code>c</code>.
- * The image returned will be an instance of VolatileImage, or null
- * if a VolatileImage object could not be instantiated.
- * This buffer might be smaller than <code>(proposedWidth,proposedHeight)</code>.
- * This happens when the maximum double buffer size has been set for this
- * repaint manager.
- *
- * @see java.awt.image.VolatileImage
- * @since 1.4
- */
+ /**
+ * Return a volatile offscreen buffer that should be used as a
+ * double buffer with the specified component <code>c</code>.
+ * The image returned will be an instance of VolatileImage, or null
+ * if a VolatileImage object could not be instantiated.
+ * This buffer might be smaller than <code>(proposedWidth,proposedHeight)</code>.
+ * This happens when the maximum double buffer size has been set for this
+ * repaint manager.
+ *
+ * @param c the component
+ * @param proposedWidth the width of the buffer
+ * @param proposedHeight the height of the buffer
+ *
+ * @return the volatile image
+ * @see java.awt.image.VolatileImage
+ * @since 1.4
+ */
public Image getVolatileOffscreenBuffer(Component c,
int proposedWidth,int proposedHeight) {
RepaintManager delegate = getDelegate(c);
@@ -1104,7 +1129,11 @@
}
- /** Set the maximum double buffer size. **/
+ /**
+ * Set the maximum double buffer size.
+ *
+ * @param d the dimension
+ */
public void setDoubleBufferMaximumSize(Dimension d) {
doubleBufferMaxSize = d;
if (doubleBufferMaxSize == null) {
--- a/jdk/src/share/classes/javax/swing/RootPaneContainer.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/swing/RootPaneContainer.java Wed Jul 05 19:46:31 2017 +0200
@@ -132,6 +132,7 @@
* Generally implemented with<pre>
* getRootPane().setLayeredPane(layeredPane);</pre>
*
+ * @param layeredPane the layered pane
* @exception java.awt.IllegalComponentStateException (a runtime
* exception) if the layered pane parameter is null
* @see #getLayeredPane
@@ -162,6 +163,7 @@
* Generally implemented with
* <code>getRootPane().setGlassPane(glassPane);</code>
*
+ * @param glassPane the glass pane
* @see #getGlassPane
* @see JRootPane#setGlassPane
*/
--- a/jdk/src/share/classes/javax/swing/ScrollPaneLayout.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/swing/ScrollPaneLayout.java Wed Jul 05 19:46:31 2017 +0200
@@ -168,6 +168,8 @@
* };
* scrollpane.setLayout(mySPLayout):
* </pre>
+ *
+ * @param sp an instance of the {@code JScrollPane}
*/
public void syncWithScrollPane(JScrollPane sp) {
viewport = sp.getViewport();
@@ -1106,6 +1108,7 @@
* Returns the bounds of the border around the specified scroll pane's
* viewport.
*
+ * @param scrollpane an instance of the {@code JScrollPane}
* @return the size and position of the viewport border
* @deprecated As of JDK version Swing1.1
* replaced by <code>JScrollPane.getViewportBorderBounds()</code>.
--- a/jdk/src/share/classes/javax/swing/SwingUtilities.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/swing/SwingUtilities.java Wed Jul 05 19:46:31 2017 +0200
@@ -103,15 +103,23 @@
}
/**
- * Return true if <code>a</code> contains <code>b</code>
+ * Return {@code true} if @{code a} contains {@code b}
+ *
+ * @param a the first rectangle
+ * @param b the second rectangle
+ *
+ * @return {@code true} if @{code a} contains {@code b}
*/
- public static final boolean isRectangleContainingRectangle(Rectangle a,Rectangle b) {
+ public static boolean isRectangleContainingRectangle(Rectangle a,Rectangle b) {
return b.x >= a.x && (b.x + b.width) <= (a.x + a.width) &&
b.y >= a.y && (b.y + b.height) <= (a.y + a.height);
}
/**
- * Return the rectangle (0,0,bounds.width,bounds.height) for the component <code>aComponent</code>
+ * Return the rectangle (0,0,bounds.width,bounds.height) for the component {@code aComponent}
+ *
+ * @param aComponent a component
+ * @return the local bounds for the component {@code aComponent}
*/
public static Rectangle getLocalBounds(Component aComponent) {
Rectangle b = new Rectangle(aComponent.getBounds());
@@ -165,6 +173,12 @@
* root component coordinate system.
* If both <code>source</code> and <code>destination</code> are {@code null}, return <code>aPoint</code>
* without any conversion.
+ *
+ * @param source the source component
+ * @param aPoint the point
+ * @param destination the destination component
+ *
+ * @return the converted coordinate
*/
public static Point convertPoint(Component source,Point aPoint,Component destination) {
Point p;
@@ -196,6 +210,13 @@
* root component coordinate system.
* If both <code>source</code> and <code>destination</code> are {@code null}, return <code>(x,y)</code>
* without any conversion.
+ *
+ * @param source the source component
+ * @param x the x-coordinate of the point
+ * @param y the y-coordinate of the point
+ * @param destination the destination component
+ *
+ * @return the converted coordinate
*/
public static Point convertPoint(Component source,int x, int y,Component destination) {
Point point = new Point(x,y);
@@ -211,6 +232,12 @@
* root component coordinate system.
* If both <code>source</code> and <code>destination</code> are {@code null}, return <code>aRectangle</code>
* without any conversion.
+ *
+ * @param source the source component
+ * @param aRectangle a rectangle
+ * @param destination the destination component
+ *
+ * @return the converted rectangle
*/
public static Rectangle convertRectangle(Component source,Rectangle aRectangle,Component destination) {
Point point = new Point(aRectangle.x,aRectangle.y);
@@ -222,6 +249,12 @@
* Convenience method for searching above <code>comp</code> in the
* component hierarchy and returns the first object of class <code>c</code> it
* finds. Can return {@code null}, if a class <code>c</code> cannot be found.
+ *
+ * @param c the class of a component
+ * @param comp the component
+ *
+ * @return the ancestor of the {@code comp},
+ * or {@code null} if {@code c} cannot be found.
*/
public static Container getAncestorOfClass(Class<?> c, Component comp)
{
@@ -238,6 +271,12 @@
* Convenience method for searching above <code>comp</code> in the
* component hierarchy and returns the first object of <code>name</code> it
* finds. Can return {@code null}, if <code>name</code> cannot be found.
+ *
+ * @param name the name of a component
+ * @param comp the component
+ *
+ * @return the ancestor of the {@code comp},
+ * or {@code null} if {@code name} cannot be found.
*/
public static Container getAncestorNamed(String name, Component comp) {
if(comp == null || name == null)
@@ -260,6 +299,8 @@
* @param parent the root component to begin the search
* @param x the x target location
* @param y the y target location
+ *
+ * @return the deepest component
*/
public static Component getDeepestComponentAt(Component parent, int x, int y) {
if (!parent.contains(x, y)) {
@@ -297,6 +338,12 @@
* to <code>destination</code> if destination is non-{@code null}
* use the translateMouseEvent() method to translate a mouse event from
* one component to another without changing the source.
+ *
+ * @param source the source component
+ * @param sourceEvent the source mouse event
+ * @param destination the destination component
+ *
+ * @return the new mouse event
*/
public static MouseEvent convertMouseEvent(Component source,
MouseEvent sourceEvent,
@@ -456,7 +503,11 @@
}
/**
- * Return <code>true</code> if a component <code>a</code> descends from a component <code>b</code>
+ * Return {@code true} if a component {@code a} descends from a component {@code b}
+ *
+ * @param a the first component
+ * @param b the second component
+ * @return {@code true} if a component {@code a} descends from a component {@code b}
*/
public static boolean isDescendingFrom(Component a,Component b) {
if(a == b)
@@ -531,6 +582,12 @@
* Convenience returning an array of rect representing the regions within
* <code>rectA</code> that do not overlap with <code>rectB</code>. If the
* two Rects do not overlap, returns an empty array
+ *
+ * @param rectA the first rectangle
+ * @param rectB the second rectangle
+ *
+ * @return an array of rectangles representing the regions within {@code rectA}
+ * that do not overlap with {@code rectB}.
*/
public static Rectangle[] computeDifference(Rectangle rectA,Rectangle rectB) {
if (rectB == null || !rectA.intersects(rectB) || isRectangleContainingRectangle(rectB,rectA)) {
@@ -841,6 +898,21 @@
* relative to the viewR rectangle.
* The JComponents orientation (LEADING/TRAILING) will also be taken
* into account and translated into LEFT/RIGHT values accordingly.
+ *
+ * @param c the component
+ * @param fm the instance of {@code FontMetrics}
+ * @param text the text
+ * @param icon the icon
+ * @param verticalAlignment the vertical alignment
+ * @param horizontalAlignment the horizontal alignment
+ * @param verticalTextPosition the vertical text position
+ * @param horizontalTextPosition the horizontal text position
+ * @param viewR the available rectangle
+ * @param iconR the rectangle for the icon
+ * @param textR the rectangle for the text
+ * @param textIconGap the gap between text and icon
+ *
+ * @return the possibly clipped version of the compound labels string
*/
public static String layoutCompoundLabel(JComponent c,
FontMetrics fm,
@@ -910,6 +982,20 @@
* values in horizontalTextPosition (they will default to RIGHT) and in
* horizontalAlignment (they will default to CENTER).
* Use the other version of layoutCompoundLabel() instead.
+ *
+ * @param fm the instance of {@code FontMetrics}
+ * @param text the text
+ * @param icon the icon
+ * @param verticalAlignment the vertical alignment
+ * @param horizontalAlignment the horizontal alignment
+ * @param verticalTextPosition the vertical text position
+ * @param horizontalTextPosition the horizontal text position
+ * @param viewR the available rectangle
+ * @param iconR the rectangle for the icon
+ * @param textR the rectangle for the text
+ * @param textIconGap the gap between text and icon
+ *
+ * @return the possibly clipped version of the compound labels string
*/
public static String layoutCompoundLabel(
FontMetrics fm,
@@ -1219,6 +1305,8 @@
* A simple minded look and feel change: ask each node in the tree
* to <code>updateUI()</code> -- that is, to initialize its UI property
* with the current look and feel.
+ *
+ * @param c the component
*/
public static void updateComponentTreeUI(Component c) {
updateComponentTreeUI0(c);
@@ -1284,6 +1372,7 @@
* <p>
* Unlike the rest of Swing, this method can be invoked from any thread.
*
+ * @param doRun the instance of {@code Runnable}
* @see #invokeAndWait
*/
public static void invokeLater(Runnable doRun) {
@@ -1334,6 +1423,7 @@
* As of 1.3 this method is just a cover for
* <code>java.awt.EventQueue.invokeAndWait()</code>.
*
+ * @param doRun the instance of {@code Runnable}
* @exception InterruptedException if we're interrupted while waiting for
* the event dispatching thread to finish executing
* <code>doRun.run()</code>
@@ -1374,6 +1464,7 @@
* Component.AccessibleAWTComponent.getAccessibleIndexInParent() instead
* of using this method.
*
+ * @param c the component
* @return -1 of this object does not have an accessible parent.
* Otherwise, the index of the child in its accessible parent.
*/
@@ -1386,6 +1477,8 @@
* local coordinate <code>Point</code>, if one exists.
* Otherwise returns <code>null</code>.
*
+ * @param c the component
+ * @param p the local coordinate
* @return the <code>Accessible</code> at the specified location,
* if it exists; otherwise <code>null</code>
*/
@@ -1431,6 +1524,7 @@
* Component.AccessibleAWTComponent.getAccessibleIndexInParent() instead
* of using this method.
*
+ * @param c the component
* @return an instance of AccessibleStateSet containing the current state
* set of the object
* @see AccessibleState
@@ -1448,6 +1542,7 @@
* Component.AccessibleAWTComponent.getAccessibleIndexInParent() instead
* of using this method.
*
+ * @param c the component
* @return the number of accessible children in the object.
*/
public static int getAccessibleChildrenCount(Component c) {
@@ -1461,6 +1556,7 @@
* Component.AccessibleAWTComponent.getAccessibleIndexInParent() instead
* of using this method.
*
+ * @param c the component
* @param i zero-based index of child
* @return the nth Accessible child of the object
*/
@@ -1502,6 +1598,8 @@
/**
* If c is a JRootPane descendant return its JRootPane ancestor.
* If c is a RootPaneContainer then return its JRootPane.
+ *
+ * @param c the component
* @return the JRootPane for Component c or {@code null}.
*/
public static JRootPane getRootPane(Component c) {
@@ -1519,6 +1617,8 @@
/**
* Returns the root component for the current component tree.
+ *
+ * @param c the component
* @return the first ancestor of c that's a Window or the last Applet ancestor
*/
public static Component getRoot(Component c) {
@@ -1616,6 +1716,14 @@
* This will return true if <code>action</code> is non-{@code null} and
* actionPerformed is invoked on it.
*
+ * @param action an action
+ * @param ks a key stroke
+ * @param event a key event
+ * @param sender a sender
+ * @param modifiers action modifiers
+ * @return {@code true} if {@code action} is non-{@code null} and
+ * actionPerformed is invoked on it.
+ *
* @since 1.3
*/
public static boolean notifyAction(Action action, KeyStroke ks,
@@ -1672,6 +1780,9 @@
* to <code>uiInputMap</code>. If <code>uiInputMap</code> is {@code null},
* this removes any previously installed UI InputMap.
*
+ * @param component a component
+ * @param type a type
+ * @param uiInputMap an {@code InputMap}
* @since 1.3
*/
public static void replaceUIInputMap(JComponent component, int type,
@@ -1694,6 +1805,8 @@
* to <code>uiActionMap</code>. If <code>uiActionMap</code> is {@code null},
* this removes any previously installed UI ActionMap.
*
+ * @param component a component
+ * @param uiActionMap an {@code ActionMap}
* @since 1.3
*/
public static void replaceUIActionMap(JComponent component,
@@ -1714,9 +1827,14 @@
/**
* Returns the InputMap provided by the UI for condition
* <code>condition</code> in component <code>component</code>.
- * <p>This will return {@code null} if the UI has not installed a InputMap
+ * <p>This will return {@code null} if the UI has not installed an InputMap
* of the specified type.
*
+ * @param component a component
+ * @param condition a condition
+ * @return the {@code ActionMap} provided by the UI for {@code condition}
+ * in the component, or {@code null} if the UI has not installed
+ * an InputMap of the specified type.
* @since 1.3
*/
public static InputMap getUIInputMap(JComponent component, int condition) {
@@ -1736,6 +1854,9 @@
* in component <code>component</code>.
* <p>This will return {@code null} if the UI has not installed an ActionMap.
*
+ * @param component a component
+ * @return the {@code ActionMap} provided by the UI in the component,
+ * or {@code null} if the UI has not installed an ActionMap.
* @since 1.3
*/
public static ActionMap getUIActionMap(JComponent component) {
--- a/jdk/src/share/classes/javax/swing/event/TreeModelEvent.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/swing/event/TreeModelEvent.java Wed Jul 05 19:46:31 2017 +0200
@@ -292,24 +292,24 @@
* @return a String representation of this object
*/
public String toString() {
- StringBuffer retBuffer = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
- retBuffer.append(getClass().getName() + " " +
- Integer.toString(hashCode()));
+ sb.append(getClass().getName() + " " +
+ Integer.toString(hashCode()));
if(path != null)
- retBuffer.append(" path " + path);
+ sb.append(" path " + path);
if(childIndices != null) {
- retBuffer.append(" indices [ ");
+ sb.append(" indices [ ");
for(int counter = 0; counter < childIndices.length; counter++)
- retBuffer.append(Integer.toString(childIndices[counter])+ " ");
- retBuffer.append("]");
+ sb.append(Integer.toString(childIndices[counter])+ " ");
+ sb.append("]");
}
if(children != null) {
- retBuffer.append(" children [ ");
+ sb.append(" children [ ");
for(int counter = 0; counter < children.length; counter++)
- retBuffer.append(children[counter] + " ");
- retBuffer.append("]");
+ sb.append(children[counter] + " ");
+ sb.append("]");
}
- return retBuffer.toString();
+ return sb.toString();
}
}
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicFileChooserUI.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicFileChooserUI.java Wed Jul 05 19:46:31 2017 +0200
@@ -1322,8 +1322,8 @@
return null;
}
- StringBuffer plainBuf = new StringBuffer();
- StringBuffer htmlBuf = new StringBuffer();
+ StringBuilder plainBuf = new StringBuilder();
+ StringBuilder htmlBuf = new StringBuilder();
htmlBuf.append("<html>\n<body>\n<ul>\n");
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicListUI.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicListUI.java Wed Jul 05 19:46:31 2017 +0200
@@ -2855,23 +2855,23 @@
return null;
}
- StringBuffer plainBuf = new StringBuffer();
- StringBuffer htmlBuf = new StringBuffer();
+ StringBuilder plainStr = new StringBuilder();
+ StringBuilder htmlStr = new StringBuilder();
- htmlBuf.append("<html>\n<body>\n<ul>\n");
+ htmlStr.append("<html>\n<body>\n<ul>\n");
for (int i = 0; i < values.length; i++) {
Object obj = values[i];
String val = ((obj == null) ? "" : obj.toString());
- plainBuf.append(val + "\n");
- htmlBuf.append(" <li>" + val + "\n");
+ plainStr.append(val + "\n");
+ htmlStr.append(" <li>" + val + "\n");
}
// remove the last newline
- plainBuf.deleteCharAt(plainBuf.length() - 1);
- htmlBuf.append("</ul>\n</body>\n</html>");
+ plainStr.deleteCharAt(plainStr.length() - 1);
+ htmlStr.append("</ul>\n</body>\n</html>");
- return new BasicTransferable(plainBuf.toString(), htmlBuf.toString());
+ return new BasicTransferable(plainStr.toString(), htmlStr.toString());
}
return null;
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicTableUI.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicTableUI.java Wed Jul 05 19:46:31 2017 +0200
@@ -2182,29 +2182,29 @@
return null;
}
- StringBuffer plainBuf = new StringBuffer();
- StringBuffer htmlBuf = new StringBuffer();
+ StringBuilder plainStr = new StringBuilder();
+ StringBuilder htmlStr = new StringBuilder();
- htmlBuf.append("<html>\n<body>\n<table>\n");
+ htmlStr.append("<html>\n<body>\n<table>\n");
for (int row = 0; row < rows.length; row++) {
- htmlBuf.append("<tr>\n");
+ htmlStr.append("<tr>\n");
for (int col = 0; col < cols.length; col++) {
Object obj = table.getValueAt(rows[row], cols[col]);
String val = ((obj == null) ? "" : obj.toString());
- plainBuf.append(val + "\t");
- htmlBuf.append(" <td>" + val + "</td>\n");
+ plainStr.append(val + "\t");
+ htmlStr.append(" <td>" + val + "</td>\n");
}
// we want a newline at the end of each line and not a tab
- plainBuf.deleteCharAt(plainBuf.length() - 1).append("\n");
- htmlBuf.append("</tr>\n");
+ plainStr.deleteCharAt(plainStr.length() - 1).append("\n");
+ htmlStr.append("</tr>\n");
}
// remove the last newline
- plainBuf.deleteCharAt(plainBuf.length() - 1);
- htmlBuf.append("</table>\n</body>\n</html>");
+ plainStr.deleteCharAt(plainStr.length() - 1);
+ htmlStr.append("</table>\n</body>\n</html>");
- return new BasicTransferable(plainBuf.toString(), htmlBuf.toString());
+ return new BasicTransferable(plainStr.toString(), htmlStr.toString());
}
return null;
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicTreeUI.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicTreeUI.java Wed Jul 05 19:46:31 2017 +0200
@@ -3213,10 +3213,10 @@
return null;
}
- StringBuffer plainBuf = new StringBuffer();
- StringBuffer htmlBuf = new StringBuffer();
-
- htmlBuf.append("<html>\n<body>\n<ul>\n");
+ StringBuilder plainStr = new StringBuilder();
+ StringBuilder htmlStr = new StringBuilder();
+
+ htmlStr.append("<html>\n<body>\n<ul>\n");
TreeModel model = tree.getModel();
TreePath lastPath = null;
@@ -3227,17 +3227,17 @@
boolean leaf = model.isLeaf(node);
String label = getDisplayString(path, true, leaf);
- plainBuf.append(label + "\n");
- htmlBuf.append(" <li>" + label + "\n");
+ plainStr.append(label + "\n");
+ htmlStr.append(" <li>" + label + "\n");
}
// remove the last newline
- plainBuf.deleteCharAt(plainBuf.length() - 1);
- htmlBuf.append("</ul>\n</body>\n</html>");
+ plainStr.deleteCharAt(plainStr.length() - 1);
+ htmlStr.append("</ul>\n</body>\n</html>");
tree = null;
- return new BasicTransferable(plainBuf.toString(), htmlBuf.toString());
+ return new BasicTransferable(plainStr.toString(), htmlStr.toString());
}
return null;
--- a/jdk/src/share/classes/javax/swing/plaf/metal/MetalFileChooserUI.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/swing/plaf/metal/MetalFileChooserUI.java Wed Jul 05 19:46:31 2017 +0200
@@ -618,20 +618,20 @@
}
private String fileNameString(File[] files) {
- StringBuffer buf = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
for (int i = 0; files != null && i < files.length; i++) {
if (i > 0) {
- buf.append(" ");
+ sb.append(" ");
}
if (files.length > 1) {
- buf.append("\"");
+ sb.append("\"");
}
- buf.append(fileNameString(files[i]));
+ sb.append(fileNameString(files[i]));
if (files.length > 1) {
- buf.append("\"");
+ sb.append("\"");
}
}
- return buf.toString();
+ return sb.toString();
}
/* The following methods are used by the PropertyChange Listener */
--- a/jdk/src/share/classes/javax/swing/plaf/nimbus/State.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/swing/plaf/nimbus/State.java Wed Jul 05 19:46:31 2017 +0200
@@ -179,35 +179,35 @@
}
private static String toString(int state) {
- StringBuffer buffer = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
if ((state & SynthConstants.DEFAULT) == SynthConstants.DEFAULT) {
- buffer.append("Default");
+ sb.append("Default");
}
if ((state & SynthConstants.DISABLED) == SynthConstants.DISABLED) {
- if (buffer.length() > 0) buffer.append("+");
- buffer.append("Disabled");
+ if (sb.length() > 0) sb.append("+");
+ sb.append("Disabled");
}
if ((state & SynthConstants.ENABLED) == SynthConstants.ENABLED) {
- if (buffer.length() > 0) buffer.append("+");
- buffer.append("Enabled");
+ if (sb.length() > 0) sb.append("+");
+ sb.append("Enabled");
}
if ((state & SynthConstants.FOCUSED) == SynthConstants.FOCUSED) {
- if (buffer.length() > 0) buffer.append("+");
- buffer.append("Focused");
+ if (sb.length() > 0) sb.append("+");
+ sb.append("Focused");
}
if ((state & SynthConstants.MOUSE_OVER) == SynthConstants.MOUSE_OVER) {
- if (buffer.length() > 0) buffer.append("+");
- buffer.append("MouseOver");
+ if (sb.length() > 0) sb.append("+");
+ sb.append("MouseOver");
}
if ((state & SynthConstants.PRESSED) == SynthConstants.PRESSED) {
- if (buffer.length() > 0) buffer.append("+");
- buffer.append("Pressed");
+ if (sb.length() > 0) sb.append("+");
+ sb.append("Pressed");
}
if ((state & SynthConstants.SELECTED) == SynthConstants.SELECTED) {
- if (buffer.length() > 0) buffer.append("+");
- buffer.append("Selected");
+ if (sb.length() > 0) sb.append("+");
+ sb.append("Selected");
}
- return buffer.toString();
+ return sb.toString();
}
}
}
--- a/jdk/src/share/classes/javax/swing/plaf/synth/ParsedSynthStyle.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/ParsedSynthStyle.java Wed Jul 05 19:46:31 2017 +0200
@@ -156,7 +156,7 @@
}
public String toString() {
- StringBuffer text = new StringBuffer(super.toString());
+ StringBuilder text = new StringBuilder(super.toString());
if (_painters != null) {
text.append(",painters=[");
for (int i = 0; i < +_painters.length; i++) {
@@ -208,7 +208,7 @@
}
public String toString() {
- StringBuffer text = new StringBuffer(super.toString());
+ StringBuilder text = new StringBuilder(super.toString());
text.append(",painters=[");
if (_painterInfo != null) {
for (int i = 0; i < +_painterInfo.length; i++) {
--- a/jdk/src/share/classes/javax/swing/tree/DefaultTreeSelectionModel.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/swing/tree/DefaultTreeSelectionModel.java Wed Jul 05 19:46:31 2017 +0200
@@ -1153,23 +1153,23 @@
*/
public String toString() {
int selCount = getSelectionCount();
- StringBuffer retBuffer = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
int[] rows;
if(rowMapper != null)
rows = rowMapper.getRowsForPaths(selection);
else
rows = null;
- retBuffer.append(getClass().getName() + " " + hashCode() + " [ ");
+ sb.append(getClass().getName() + " " + hashCode() + " [ ");
for(int counter = 0; counter < selCount; counter++) {
if(rows != null)
- retBuffer.append(selection[counter].toString() + "@" +
- Integer.toString(rows[counter])+ " ");
+ sb.append(selection[counter].toString() + "@" +
+ Integer.toString(rows[counter])+ " ");
else
- retBuffer.append(selection[counter].toString() + " ");
+ sb.append(selection[counter].toString() + " ");
}
- retBuffer.append("]");
- return retBuffer.toString();
+ sb.append("]");
+ return sb.toString();
}
/**
--- a/jdk/src/share/classes/javax/swing/tree/TreePath.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/javax/swing/tree/TreePath.java Wed Jul 05 19:46:31 2017 +0200
@@ -349,7 +349,7 @@
* @return a String representation of this object
*/
public String toString() {
- StringBuffer tempSpot = new StringBuffer("[");
+ StringBuilder tempSpot = new StringBuilder("[");
for(int counter = 0, maxCounter = getPathCount();counter < maxCounter;
counter++) {
--- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/ApacheNodeSetData.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/ApacheNodeSetData.java Wed Jul 05 19:46:31 2017 +0200
@@ -21,7 +21,7 @@
* under the License.
*/
/*
- * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
*/
/*
* $Id: ApacheNodeSetData.java 1203890 2011-11-18 22:47:56Z mullan $
@@ -47,7 +47,7 @@
this.xi = xi;
}
- public Iterator iterator() {
+ public Iterator<Node> iterator() {
// If nodefilters are set, must execute them first to create node-set
if (xi.getNodeFilters() != null && !xi.getNodeFilters().isEmpty()) {
return Collections.unmodifiableSet
--- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMExcC14NMethod.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMExcC14NMethod.java Wed Jul 05 19:46:31 2017 +0200
@@ -118,7 +118,7 @@
}
ExcC14NParameterSpec params = (ExcC14NParameterSpec)spec;
- StringBuffer prefixListAttr = new StringBuffer("");
+ StringBuilder prefixListAttr = new StringBuilder("");
@SuppressWarnings("unchecked")
List<String> prefixList = params.getPrefixList();
for (int i = 0, size = prefixList.size(); i < size; i++) {
--- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMKeyInfo.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMKeyInfo.java Wed Jul 05 19:46:31 2017 +0200
@@ -21,7 +21,7 @@
* under the License.
*/
/*
- * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
*/
/*
* $Id: DOMKeyInfo.java 1333869 2012-05-04 10:42:44Z coheigea $
@@ -138,7 +138,7 @@
return id;
}
- public List getContent() {
+ public List<XMLStructure> getContent() {
return keyInfoTypes;
}
--- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMKeyInfoFactory.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMKeyInfoFactory.java Wed Jul 05 19:46:31 2017 +0200
@@ -21,7 +21,7 @@
* under the License.
*/
/*
- * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
*/
/*
* $Id: DOMKeyInfoFactory.java 1333869 2012-05-04 10:42:44Z coheigea $
@@ -48,11 +48,12 @@
public DOMKeyInfoFactory() { }
+ @SuppressWarnings("rawtypes")
public KeyInfo newKeyInfo(List content) {
return newKeyInfo(content, null);
}
- @SuppressWarnings("unchecked")
+ @SuppressWarnings({ "unchecked", "rawtypes" })
public KeyInfo newKeyInfo(List content, String id) {
return new DOMKeyInfo(content, id);
}
@@ -78,12 +79,12 @@
return newPGPData(keyId, null, null);
}
- @SuppressWarnings("unchecked")
+ @SuppressWarnings({ "unchecked", "rawtypes" })
public PGPData newPGPData(byte[] keyId, byte[] keyPacket, List other) {
return new DOMPGPData(keyId, keyPacket, other);
}
- @SuppressWarnings("unchecked")
+ @SuppressWarnings({ "unchecked", "rawtypes" })
public PGPData newPGPData(byte[] keyPacket, List other) {
return new DOMPGPData(keyPacket, other);
}
@@ -92,7 +93,7 @@
return newRetrievalMethod(uri, null, null);
}
- @SuppressWarnings("unchecked")
+ @SuppressWarnings({ "unchecked", "rawtypes" })
public RetrievalMethod newRetrievalMethod(String uri, String type,
List transforms) {
if (uri == null) {
@@ -101,7 +102,7 @@
return new DOMRetrievalMethod(uri, type, transforms);
}
- @SuppressWarnings("unchecked")
+ @SuppressWarnings("rawtypes")
public X509Data newX509Data(List content) {
return new DOMX509Data(content);
}
--- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMKeyValue.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMKeyValue.java Wed Jul 05 19:46:31 2017 +0200
@@ -21,7 +21,7 @@
* under the License.
*/
/*
- * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
*/
/*
* $Id: DOMKeyValue.java 1333415 2012-05-03 12:03:51Z coheigea $
@@ -364,15 +364,16 @@
}
void getMethods() throws ClassNotFoundException, NoSuchMethodException {
- Class c = Class.forName("sun.security.ec.ECParameters");
- Class[] params = new Class[] { ECPoint.class, EllipticCurve.class };
+ Class<?> c = Class.forName("sun.security.ec.ECParameters");
+ Class<?>[] params = new Class<?>[] { ECPoint.class,
+ EllipticCurve.class };
encodePoint = c.getMethod("encodePoint", params);
- params = new Class[] { ECParameterSpec.class };
+ params = new Class<?>[] { ECParameterSpec.class };
getCurveName = c.getMethod("getCurveName", params);
- params = new Class[] { byte[].class, EllipticCurve.class };
+ params = new Class<?>[] { byte[].class, EllipticCurve.class };
decodePoint = c.getMethod("decodePoint", params);
c = Class.forName("sun.security.ec.NamedCurve");
- params = new Class[] { String.class };
+ params = new Class<?>[] { String.class };
getECParameterSpec = c.getMethod("getECParameterSpec", params);
}
--- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMManifest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMManifest.java Wed Jul 05 19:46:31 2017 +0200
@@ -21,7 +21,7 @@
* under the License.
*/
/*
- * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
*/
/*
* $Id: DOMManifest.java 1333415 2012-05-03 12:03:51Z coheigea $
@@ -127,7 +127,12 @@
return id;
}
- public List getReferences() {
+ @SuppressWarnings("unchecked")
+ static List<Reference> getManifestReferences(Manifest mf) {
+ return mf.getReferences();
+ }
+
+ public List<Reference> getReferences() {
return references;
}
--- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMPGPData.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMPGPData.java Wed Jul 05 19:46:31 2017 +0200
@@ -21,7 +21,7 @@
* under the License.
*/
/*
- * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
*/
/*
* $Id: DOMPGPData.java 1203846 2011-11-18 21:18:17Z mullan $
@@ -184,7 +184,7 @@
return (keyPacket == null ? null : keyPacket.clone());
}
- public List getExternalElements() {
+ public List<XMLStructure> getExternalElements() {
return externalElements;
}
--- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMReference.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMReference.java Wed Jul 05 19:46:31 2017 +0200
@@ -21,7 +21,7 @@
* under the License.
*/
/*
- * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
*/
/*
* ===========================================================================
@@ -293,7 +293,7 @@
return type;
}
- public List getTransforms() {
+ public List<Transform> getTransforms() {
return Collections.unmodifiableList(allTransforms);
}
@@ -643,7 +643,7 @@
try {
final Set<Node> s = xsi.getNodeSet();
return new NodeSetData() {
- public Iterator iterator() { return s.iterator(); }
+ public Iterator<Node> iterator() { return s.iterator(); }
};
} catch (Exception e) {
// log a warning
--- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMRetrievalMethod.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMRetrievalMethod.java Wed Jul 05 19:46:31 2017 +0200
@@ -21,7 +21,7 @@
* under the License.
*/
/*
- * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
*/
/*
* ===========================================================================
@@ -177,7 +177,7 @@
return type;
}
- public List getTransforms() {
+ public List<Transform> getTransforms() {
return transforms;
}
@@ -245,7 +245,7 @@
// guard against RetrievalMethod loops
if ((data instanceof NodeSetData) && Utils.secureValidation(context)) {
NodeSetData nsd = (NodeSetData)data;
- Iterator i = nsd.iterator();
+ Iterator<?> i = nsd.iterator();
if (i.hasNext()) {
Node root = (Node)i.next();
if ("RetrievalMethod".equals(root.getLocalName())) {
--- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMSignatureProperties.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMSignatureProperties.java Wed Jul 05 19:46:31 2017 +0200
@@ -21,7 +21,7 @@
* under the License.
*/
/*
- * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
*/
/*
* $Id: DOMSignatureProperties.java 1333415 2012-05-03 12:03:51Z coheigea $
@@ -125,7 +125,7 @@
}
}
- public List getProperties() {
+ public List<SignatureProperty> getProperties() {
return properties;
}
--- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMSignatureProperty.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMSignatureProperty.java Wed Jul 05 19:46:31 2017 +0200
@@ -21,7 +21,7 @@
* under the License.
*/
/*
- * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
*/
/*
* $Id: DOMSignatureProperty.java 1333415 2012-05-03 12:03:51Z coheigea $
@@ -123,7 +123,7 @@
}
}
- public List getContent() {
+ public List<XMLStructure> getContent() {
return content;
}
--- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMSignedInfo.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMSignedInfo.java Wed Jul 05 19:46:31 2017 +0200
@@ -21,7 +21,7 @@
* under the License.
*/
/*
- * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
*/
/*
* $Id: DOMSignedInfo.java 1333415 2012-05-03 12:03:51Z coheigea $
@@ -206,7 +206,7 @@
return id;
}
- public List getReferences() {
+ public List<Reference> getReferences() {
return references;
}
--- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMSubTreeData.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMSubTreeData.java Wed Jul 05 19:46:31 2017 +0200
@@ -21,7 +21,7 @@
* under the License.
*/
/*
- * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
*/
/*
* $Id$
@@ -54,7 +54,7 @@
this.excludeComments = excludeComments;
}
- public Iterator iterator() {
+ public Iterator<Node> iterator() {
return new DelayedNodeIterator(root, excludeComments);
}
--- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMURIDereferencer.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMURIDereferencer.java Wed Jul 05 19:46:31 2017 +0200
@@ -21,7 +21,7 @@
* under the License.
*/
/*
- * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
*/
/*
* $Id: DOMURIDereferencer.java 1231033 2012-01-13 12:12:12Z coheigea $
@@ -111,7 +111,8 @@
try {
ResourceResolver apacheResolver =
ResourceResolver.getInstance(uriAttr, baseURI, secVal);
- XMLSignatureInput in = apacheResolver.resolve(uriAttr, baseURI);
+ XMLSignatureInput in = apacheResolver.resolve(uriAttr,
+ baseURI, secVal);
if (in.isOctetStream()) {
return new ApacheOctetStreamData(in);
} else {
--- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMX509Data.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMX509Data.java Wed Jul 05 19:46:31 2017 +0200
@@ -21,7 +21,7 @@
* under the License.
*/
/*
- * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
*/
/*
* $Id: DOMX509Data.java 1333415 2012-05-03 12:03:51Z coheigea $
@@ -135,7 +135,7 @@
this.content = Collections.unmodifiableList(content);
}
- public List getContent() {
+ public List<Object> getContent() {
return content;
}
--- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMXMLObject.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMXMLObject.java Wed Jul 05 19:46:31 2017 +0200
@@ -21,7 +21,7 @@
* under the License.
*/
/*
- * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
*/
/*
* $Id: DOMXMLObject.java 1333415 2012-05-03 12:03:51Z coheigea $
@@ -139,7 +139,7 @@
this.objectElem = objElem;
}
- public List getContent() {
+ public List<XMLStructure> getContent() {
return content;
}
--- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMXMLSignature.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMXMLSignature.java Wed Jul 05 19:46:31 2017 +0200
@@ -21,7 +21,7 @@
* under the License.
*/
/*
- * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
*/
/*
* ===========================================================================
@@ -188,7 +188,7 @@
return si;
}
- public List getObjects() {
+ public List<XMLObject> getObjects() {
return objects;
}
@@ -471,7 +471,8 @@
digestReference((DOMReference)xs, signContext);
} else if (xs instanceof Manifest) {
Manifest man = (Manifest)xs;
- List manRefs = man.getReferences();
+ List<Reference> manRefs =
+ DOMManifest.getManifestReferences(man);
for (int i = 0, size = manRefs.size(); i < size; i++) {
digestReference((DOMReference)manRefs.get(i),
signContext);
--- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMXMLSignatureFactory.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMXMLSignatureFactory.java Wed Jul 05 19:46:31 2017 +0200
@@ -58,7 +58,7 @@
return new DOMXMLSignature(si, ki, null, null, null);
}
- @SuppressWarnings("unchecked")
+ @SuppressWarnings({ "unchecked", "rawtypes" })
public XMLSignature newXMLSignature(SignedInfo si, KeyInfo ki,
List objects, String id, String signatureValueId) {
return new DOMXMLSignature(si, ki, objects, id, signatureValueId);
@@ -68,13 +68,13 @@
return newReference(uri, dm, null, null, null);
}
- @SuppressWarnings("unchecked")
+ @SuppressWarnings({ "unchecked", "rawtypes" })
public Reference newReference(String uri, DigestMethod dm, List transforms,
String type, String id) {
return new DOMReference(uri, type, dm, transforms, id, getProvider());
}
- @SuppressWarnings("unchecked")
+ @SuppressWarnings({ "unchecked", "rawtypes" })
public Reference newReference(String uri, DigestMethod dm,
List appliedTransforms, Data result, List transforms, String type,
String id) {
@@ -91,7 +91,7 @@
(uri, type, dm, appliedTransforms, result, transforms, id, getProvider());
}
- @SuppressWarnings("unchecked")
+ @SuppressWarnings({ "unchecked", "rawtypes" })
public Reference newReference(String uri, DigestMethod dm, List transforms,
String type, String id, byte[] digestValue) {
if (digestValue == null) {
@@ -101,41 +101,41 @@
(uri, type, dm, null, null, transforms, id, digestValue, getProvider());
}
- @SuppressWarnings("unchecked")
+ @SuppressWarnings("rawtypes")
public SignedInfo newSignedInfo(CanonicalizationMethod cm,
SignatureMethod sm, List references) {
return newSignedInfo(cm, sm, references, null);
}
- @SuppressWarnings("unchecked")
+ @SuppressWarnings({ "unchecked", "rawtypes" })
public SignedInfo newSignedInfo(CanonicalizationMethod cm,
SignatureMethod sm, List references, String id) {
return new DOMSignedInfo(cm, sm, references, id);
}
// Object factory methods
- @SuppressWarnings("unchecked")
+ @SuppressWarnings({ "unchecked", "rawtypes" })
public XMLObject newXMLObject(List content, String id, String mimeType,
String encoding) {
return new DOMXMLObject(content, id, mimeType, encoding);
}
- @SuppressWarnings("unchecked")
+ @SuppressWarnings("rawtypes")
public Manifest newManifest(List references) {
return newManifest(references, null);
}
- @SuppressWarnings("unchecked")
+ @SuppressWarnings({ "unchecked", "rawtypes" })
public Manifest newManifest(List references, String id) {
return new DOMManifest(references, id);
}
- @SuppressWarnings("unchecked")
+ @SuppressWarnings({ "unchecked", "rawtypes" })
public SignatureProperties newSignatureProperties(List props, String id) {
return new DOMSignatureProperties(props, id);
}
- @SuppressWarnings("unchecked")
+ @SuppressWarnings({ "unchecked", "rawtypes" })
public SignatureProperty newSignatureProperty
(List info, String target, String id) {
return new DOMSignatureProperty(info, target, id);
--- a/jdk/src/share/classes/sun/applet/AppletViewer.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/applet/AppletViewer.java Wed Jul 05 19:46:31 2017 +0200
@@ -1000,15 +1000,15 @@
* Scan identifier
*/
public static String scanIdentifier(Reader in) throws IOException {
- StringBuffer buf = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
while (true) {
if (((c >= 'a') && (c <= 'z')) ||
((c >= 'A') && (c <= 'Z')) ||
((c >= '0') && (c <= '9')) || (c == '_')) {
- buf.append((char)c);
+ sb.append((char) c);
c = in.read();
} else {
- return buf.toString();
+ return sb.toString();
}
}
}
@@ -1031,19 +1031,19 @@
quote = c;
c = in.read();
}
- StringBuffer buf = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
while ((c > 0) &&
(((quote < 0) && (c != ' ') && (c != '\t') &&
(c != '\n') && (c != '\r') && (c != '>'))
|| ((quote >= 0) && (c != quote)))) {
- buf.append((char)c);
+ sb.append((char) c);
c = in.read();
}
if (c == quote) {
c = in.read();
}
skipSpace(in);
- val = buf.toString();
+ val = sb.toString();
}
//statusMsgStream.println("PUT " + att + " = '" + val + "'");
if (! val.equals("")) {
--- a/jdk/src/share/classes/sun/font/Decoration.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/font/Decoration.java Wed Jul 05 19:46:31 2017 +0200
@@ -428,17 +428,17 @@
public String toString() {
- StringBuffer buf = new StringBuffer();
- buf.append(super.toString());
- buf.append("[");
- if (fgPaint != null) buf.append("fgPaint: " + fgPaint);
- if (bgPaint != null) buf.append(" bgPaint: " + bgPaint);
- if (swapColors) buf.append(" swapColors: true");
- if (strikethrough) buf.append(" strikethrough: true");
- if (stdUnderline != null) buf.append(" stdUnderline: " + stdUnderline);
- if (imUnderline != null) buf.append(" imUnderline: " + imUnderline);
- buf.append("]");
- return buf.toString();
+ StringBuilder sb = new StringBuilder();
+ sb.append(super.toString());
+ sb.append("[");
+ if (fgPaint != null) sb.append("fgPaint: " + fgPaint);
+ if (bgPaint != null) sb.append(" bgPaint: " + bgPaint);
+ if (swapColors) sb.append(" swapColors: true");
+ if (strikethrough) sb.append(" strikethrough: true");
+ if (stdUnderline != null) sb.append(" stdUnderline: " + stdUnderline);
+ if (imUnderline != null) sb.append(" imUnderline: " + imUnderline);
+ sb.append("]");
+ return sb.toString();
}
}
}
--- a/jdk/src/share/classes/sun/font/ExtendedTextSourceLabel.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/font/ExtendedTextSourceLabel.java Wed Jul 05 19:46:31 2017 +0200
@@ -896,31 +896,31 @@
if (true) {
return source.toString(TextSource.WITHOUT_CONTEXT);
}
- StringBuffer buf = new StringBuffer();
- buf.append(super.toString());
- buf.append("[source:");
- buf.append(source.toString(TextSource.WITHOUT_CONTEXT));
- buf.append(", lb:");
- buf.append(lb);
- buf.append(", ab:");
- buf.append(ab);
- buf.append(", vb:");
- buf.append(vb);
- buf.append(", gv:");
- buf.append(gv);
- buf.append(", ci: ");
+ StringBuilder sb = new StringBuilder();
+ sb.append(super.toString());
+ sb.append("[source:");
+ sb.append(source.toString(TextSource.WITHOUT_CONTEXT));
+ sb.append(", lb:");
+ sb.append(lb);
+ sb.append(", ab:");
+ sb.append(ab);
+ sb.append(", vb:");
+ sb.append(vb);
+ sb.append(", gv:");
+ sb.append(gv);
+ sb.append(", ci: ");
if (charinfo == null) {
- buf.append("null");
+ sb.append("null");
} else {
- buf.append(charinfo[0]);
+ sb.append(charinfo[0]);
for (int i = 1; i < charinfo.length;) {
- buf.append(i % numvals == 0 ? "; " : ", ");
- buf.append(charinfo[i]);
+ sb.append(i % numvals == 0 ? "; " : ", ");
+ sb.append(charinfo[i]);
}
}
- buf.append("]");
+ sb.append("]");
- return buf.toString();
+ return sb.toString();
}
//public static ExtendedTextLabel create(TextSource source) {
--- a/jdk/src/share/classes/sun/font/StandardTextSource.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/font/StandardTextSource.java Wed Jul 05 19:46:31 2017 +0200
@@ -210,16 +210,16 @@
}
public String toString(boolean withContext) {
- StringBuffer buf = new StringBuffer(super.toString());
- buf.append("[start:");
- buf.append(start);
- buf.append(", len:" );
- buf.append(len);
- buf.append(", cstart:");
- buf.append(cstart);
- buf.append(", clen:" );
- buf.append(clen);
- buf.append(", chars:\"");
+ StringBuilder sb = new StringBuilder(super.toString());
+ sb.append("[start:");
+ sb.append(start);
+ sb.append(", len:" );
+ sb.append(len);
+ sb.append(", cstart:");
+ sb.append(cstart);
+ sb.append(", clen:" );
+ sb.append(clen);
+ sb.append(", chars:\"");
int chStart, chLimit;
if (withContext == WITH_CONTEXT) {
chStart = cstart;
@@ -231,23 +231,23 @@
}
for (int i = chStart; i < chLimit; ++i) {
if (i > chStart) {
- buf.append(" ");
+ sb.append(" ");
}
- buf.append(Integer.toHexString(chars[i]));
+ sb.append(Integer.toHexString(chars[i]));
}
- buf.append("\"");
- buf.append(", level:");
- buf.append(level);
- buf.append(", flags:");
- buf.append(flags);
- buf.append(", font:");
- buf.append(font);
- buf.append(", frc:");
- buf.append(frc);
- buf.append(", cm:");
- buf.append(cm);
- buf.append("]");
+ sb.append("\"");
+ sb.append(", level:");
+ sb.append(level);
+ sb.append(", flags:");
+ sb.append(flags);
+ sb.append(", font:");
+ sb.append(font);
+ sb.append(", frc:");
+ sb.append(frc);
+ sb.append(", cm:");
+ sb.append(cm);
+ sb.append("]");
- return buf.toString();
+ return sb.toString();
}
}
--- a/jdk/src/share/classes/sun/font/Type1Font.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/font/Type1Font.java Wed Jul 05 19:46:31 2017 +0200
@@ -529,7 +529,7 @@
}
private String expandName(String s, boolean tryExpandAbbreviations) {
- StringBuffer res = new StringBuffer(s.length() + 10);
+ StringBuilder res = new StringBuilder(s.length() + 10);
int start=0, end;
while(start < s.length()) {
--- a/jdk/src/share/classes/sun/java2d/opengl/OGLContext.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/java2d/opengl/OGLContext.java Wed Jul 05 19:46:31 2017 +0200
@@ -201,29 +201,29 @@
@Override
public String toString() {
- StringBuffer buf = new StringBuffer(super.toString());
+ StringBuilder sb = new StringBuilder(super.toString());
if ((caps & CAPS_EXT_FBOBJECT) != 0) {
- buf.append("CAPS_EXT_FBOBJECT|");
+ sb.append("CAPS_EXT_FBOBJECT|");
}
if ((caps & CAPS_STORED_ALPHA) != 0) {
- buf.append("CAPS_STORED_ALPHA|");
+ sb.append("CAPS_STORED_ALPHA|");
}
if ((caps & CAPS_DOUBLEBUFFERED) != 0) {
- buf.append("CAPS_DOUBLEBUFFERED|");
+ sb.append("CAPS_DOUBLEBUFFERED|");
}
if ((caps & CAPS_EXT_LCD_SHADER) != 0) {
- buf.append("CAPS_EXT_LCD_SHADER|");
+ sb.append("CAPS_EXT_LCD_SHADER|");
}
if ((caps & CAPS_EXT_BIOP_SHADER) != 0) {
- buf.append("CAPS_BIOP_SHADER|");
+ sb.append("CAPS_BIOP_SHADER|");
}
if ((caps & CAPS_EXT_GRAD_SHADER) != 0) {
- buf.append("CAPS_EXT_GRAD_SHADER|");
+ sb.append("CAPS_EXT_GRAD_SHADER|");
}
if ((caps & CAPS_EXT_TEXRECT) != 0) {
- buf.append("CAPS_EXT_TEXRECT|");
+ sb.append("CAPS_EXT_TEXRECT|");
}
- return buf.toString();
+ return sb.toString();
}
}
}
--- a/jdk/src/share/classes/sun/java2d/pipe/Region.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/java2d/pipe/Region.java Wed Jul 05 19:46:31 2017 +0200
@@ -1277,7 +1277,7 @@
}
public String toString() {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
sb.append("Region[[");
sb.append(lox);
sb.append(", ");
--- a/jdk/src/share/classes/sun/java2d/pipe/hw/ContextCapabilities.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/java2d/pipe/hw/ContextCapabilities.java Wed Jul 05 19:46:31 2017 +0200
@@ -93,37 +93,37 @@
@Override
public String toString() {
- StringBuffer buf =
- new StringBuffer("ContextCapabilities: adapter=" +
+ StringBuilder sb =
+ new StringBuilder("ContextCapabilities: adapter=" +
adapterId+", caps=");
if (caps == CAPS_EMPTY) {
- buf.append("CAPS_EMPTY");
+ sb.append("CAPS_EMPTY");
} else {
if ((caps & CAPS_RT_PLAIN_ALPHA) != 0) {
- buf.append("CAPS_RT_PLAIN_ALPHA|");
+ sb.append("CAPS_RT_PLAIN_ALPHA|");
}
if ((caps & CAPS_RT_TEXTURE_ALPHA) != 0) {
- buf.append("CAPS_RT_TEXTURE_ALPHA|");
+ sb.append("CAPS_RT_TEXTURE_ALPHA|");
}
if ((caps & CAPS_RT_TEXTURE_OPAQUE) != 0) {
- buf.append("CAPS_RT_TEXTURE_OPAQUE|");
+ sb.append("CAPS_RT_TEXTURE_OPAQUE|");
}
if ((caps & CAPS_MULTITEXTURE) != 0) {
- buf.append("CAPS_MULTITEXTURE|");
+ sb.append("CAPS_MULTITEXTURE|");
}
if ((caps & CAPS_TEXNONPOW2) != 0) {
- buf.append("CAPS_TEXNONPOW2|");
+ sb.append("CAPS_TEXNONPOW2|");
}
if ((caps & CAPS_TEXNONSQUARE) != 0) {
- buf.append("CAPS_TEXNONSQUARE|");
+ sb.append("CAPS_TEXNONSQUARE|");
}
if ((caps & CAPS_PS20) != 0) {
- buf.append("CAPS_PS20|");
+ sb.append("CAPS_PS20|");
}
if ((caps & CAPS_PS30) != 0) {
- buf.append("CAPS_PS30|");
+ sb.append("CAPS_PS30|");
}
}
- return buf.toString();
+ return sb.toString();
}
}
--- a/jdk/src/share/classes/sun/jvmstat/monitor/HostIdentifier.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/jvmstat/monitor/HostIdentifier.java Wed Jul 05 19:46:31 2017 +0200
@@ -358,7 +358,7 @@
URI nuri = null;
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
sb.append(scheme).append("://");
--- a/jdk/src/share/classes/sun/jvmstat/monitor/MonitoredHost.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/jvmstat/monitor/MonitoredHost.java Wed Jul 05 19:46:31 2017 +0200
@@ -257,7 +257,7 @@
throws MonitorException {
String hostname = hostId.getHost();
String scheme = hostId.getScheme();
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
assert hostname != null;
--- a/jdk/src/share/classes/sun/jvmstat/monitor/VmIdentifier.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/jvmstat/monitor/VmIdentifier.java Wed Jul 05 19:46:31 2017 +0200
@@ -255,7 +255,7 @@
* a MonitorException in a future version.
*/
public HostIdentifier getHostIdentifier() throws URISyntaxException {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
if (getScheme() != null) {
sb.append(getScheme()).append(":");
}
--- a/jdk/src/share/classes/sun/management/Agent.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/management/Agent.java Wed Jul 05 19:46:31 2017 +0200
@@ -34,7 +34,6 @@
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.InetAddress;
-import java.net.Socket;
import java.net.UnknownHostException;
import java.text.MessageFormat;
import java.util.MissingResourceException;
@@ -88,7 +87,7 @@
// return empty property set
private static Properties parseString(String args) {
Properties argProps = new Properties();
- if (args != null) {
+ if (args != null && !args.trim().equals("")) {
for (String option : args.split(",")) {
String s[] = option.split("=", 2);
String name = s[0].trim();
@@ -160,53 +159,59 @@
throw new RuntimeException(getText(INVALID_STATE, "Agent already started"));
}
- Properties argProps = parseString(args);
- Properties configProps = new Properties();
+ try {
+ Properties argProps = parseString(args);
+ Properties configProps = new Properties();
- // Load the management properties from the config file
- // if config file is not specified readConfiguration implicitly
- // reads <java.home>/lib/management/management.properties
+ // Load the management properties from the config file
+ // if config file is not specified readConfiguration implicitly
+ // reads <java.home>/lib/management/management.properties
+
+ String fname = System.getProperty(CONFIG_FILE);
+ readConfiguration(fname, configProps);
- String fname = System.getProperty(CONFIG_FILE);
- readConfiguration(fname, configProps);
+ // management properties can be overridden by system properties
+ // which take precedence
+ Properties sysProps = System.getProperties();
+ synchronized (sysProps) {
+ configProps.putAll(sysProps);
+ }
- // management properties can be overridden by system properties
- // which take precedence
- Properties sysProps = System.getProperties();
- synchronized (sysProps) {
- configProps.putAll(sysProps);
- }
+ // if user specifies config file into command line for either
+ // jcmd utilities or attach command it overrides properties set in
+ // command line at the time of VM start
+ String fnameUser = argProps.getProperty(CONFIG_FILE);
+ if (fnameUser != null) {
+ readConfiguration(fnameUser, configProps);
+ }
- // if user specifies config file into command line for either
- // jcmd utilities or attach command it overrides properties set in
- // command line at the time of VM start
- String fnameUser = argProps.getProperty(CONFIG_FILE);
- if (fnameUser != null) {
- readConfiguration(fnameUser, configProps);
- }
+ // arguments specified in command line of jcmd utilities
+ // override both system properties and one set by config file
+ // specified in jcmd command line
+ configProps.putAll(argProps);
- // arguments specified in command line of jcmd utilities
- // override both system properties and one set by config file
- // specified in jcmd command line
- configProps.putAll(argProps);
+ // jcmd doesn't allow to change ThreadContentionMonitoring, but user
+ // can specify this property inside config file, so enable optional
+ // monitoring functionality if this property is set
+ final String enableThreadContentionMonitoring =
+ configProps.getProperty(ENABLE_THREAD_CONTENTION_MONITORING);
- // jcmd doesn't allow to change ThreadContentionMonitoring, but user
- // can specify this property inside config file, so enable optional
- // monitoring functionality if this property is set
- final String enableThreadContentionMonitoring =
- configProps.getProperty(ENABLE_THREAD_CONTENTION_MONITORING);
+ if (enableThreadContentionMonitoring != null) {
+ ManagementFactory.getThreadMXBean().
+ setThreadContentionMonitoringEnabled(true);
+ }
- if (enableThreadContentionMonitoring != null) {
- ManagementFactory.getThreadMXBean().
- setThreadContentionMonitoringEnabled(true);
- }
+ String jmxremotePort = configProps.getProperty(JMXREMOTE_PORT);
+ if (jmxremotePort != null) {
+ jmxServer = ConnectorBootstrap.
+ startRemoteConnectorServer(jmxremotePort, configProps);
- String jmxremotePort = configProps.getProperty(JMXREMOTE_PORT);
- if (jmxremotePort != null) {
- jmxServer = ConnectorBootstrap.
- startRemoteConnectorServer(jmxremotePort, configProps);
-
- startDiscoveryService(configProps);
+ startDiscoveryService(configProps);
+ } else {
+ throw new AgentConfigurationError(INVALID_JMXREMOTE_PORT, "No port specified");
+ }
+ } catch (AgentConfigurationError err) {
+ error(err.getError(), err.getParams());
}
}
@@ -401,7 +406,7 @@
if (home == null) {
throw new Error("Can't find java.home ??");
}
- StringBuffer defaultFileName = new StringBuffer(home);
+ StringBuilder defaultFileName = new StringBuilder(home);
defaultFileName.append(File.separator).append("lib");
defaultFileName.append(File.separator).append("management");
defaultFileName.append(File.separator).append("management.properties");
@@ -495,7 +500,7 @@
if (params == null || params.length == 0) {
error(key);
} else {
- StringBuffer message = new StringBuffer(params[0]);
+ StringBuilder message = new StringBuilder(params[0]);
for (int i = 1; i < params.length; i++) {
message.append(" " + params[i]);
}
@@ -507,7 +512,7 @@
String keyText = getText(key);
System.err.print(getText("agent.err.error") + ": " + keyText);
System.err.println(": " + message);
- throw new RuntimeException(keyText);
+ throw new RuntimeException(keyText + ": " + message);
}
public static void error(Exception e) {
--- a/jdk/src/share/classes/sun/management/manifest Thu Jun 19 11:22:36 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-Premain-Class: sun.management.Agent
-Agent-Class: sun.management.Agent
-
--- a/jdk/src/share/classes/sun/management/resources/agent.properties Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/management/resources/agent.properties Wed Jul 05 19:46:31 2017 +0200
@@ -43,7 +43,7 @@
agent.err.premain.notfound = premain(String) does not exist in agent class
agent.err.agentclass.access.denied = Access to premain(String) is denied
agent.err.invalid.agentclass = Invalid com.sun.management.agent.class property value
-agent.err.invalid.state = Invalid agent state
+agent.err.invalid.state = Invalid agent state: {0}
agent.err.invalid.jmxremote.port = Invalid com.sun.management.jmxremote.port number
agent.err.invalid.jmxremote.rmi.port = Invalid com.sun.management.jmxremote.rmi.port number
--- a/jdk/src/share/classes/sun/management/snmp/jvminstr/JvmThreadInstanceEntryImpl.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/management/snmp/jvminstr/JvmThreadInstanceEntryImpl.java Wed Jul 05 19:46:31 2017 +0200
@@ -311,19 +311,19 @@
StackTraceElement[] stackTrace = info.getStackTrace();
//We append the stack trace in a buffer
// XXX Revisit: should check isDebugOn()
- StringBuffer b = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
final int stackSize = stackTrace.length;
log.debug("getJvmThreadInstStackTrace", "Stack size : " + stackSize);
for(int i = 0; i < stackSize; i++) {
log.debug("getJvmThreadInstStackTrace", "Append " +
stackTrace[i].toString());
- b.append(stackTrace[i].toString());
+ sb.append(stackTrace[i].toString());
//Append \n at the end of each line except the last one
if(i < stackSize)
- b.append("\n");
+ sb.append("\n");
}
//The stack trace is truncated if its size exceeds 255.
- return validPathElementTC(b.toString());
+ return validPathElementTC(sb.toString());
}
static final MibLogger log =
new MibLogger(JvmThreadInstanceEntryImpl.class);
--- a/jdk/src/share/classes/sun/misc/MessageUtils.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/misc/MessageUtils.java Wed Jul 05 19:46:31 2017 +0200
@@ -55,7 +55,7 @@
}
public static String subst(String patt, String args[]) {
- StringBuffer result = new StringBuffer();
+ StringBuilder result = new StringBuilder();
int len = patt.length();
for (int i = 0; i >= 0 && i < len; i++) {
char ch = patt.charAt(i);
--- a/jdk/src/share/classes/sun/misc/Timeable.java Thu Jun 19 11:22:36 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,45 +0,0 @@
-/*
- * Copyright (c) 1995, 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.misc;
-
-/**
- * This interface is used by the Timer class. A class that uses
- * Timer objects must implement this interface.
- *
- * @see Timer
- * @author Patrick Chan
- */
-public interface Timeable {
- /**
- * This method is executed every time a timer owned by this
- * object ticks. An object can own more than one timer but
- * all timers call this method when they tick;
- * you can use the supplied timer parameter to determine
- * which timer has ticked.
- * @param timer a handle to the timer that has just ticked.
- */
- public void tick(Timer timer);
-}
--- a/jdk/src/share/classes/sun/misc/Timer.java Thu Jun 19 11:22:36 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,647 +0,0 @@
-/*
- * Copyright (c) 1995, 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.misc;
-
-/**
- A Timer object is used by algorithms that require timed events.
- For example, in an animation loop, a timer would help in
- determining when to change frames.
-
- A timer has an interval which determines when it "ticks";
- that is, a timer delays for the specified interval and then
- it calls the owner's tick() method.
-
- Here's an example of creating a timer with a 5 sec interval:
-
- <pre>
- class Main implements Timeable {
- public void tick(Timer timer) {
- System.out.println("tick");
- }
- public static void main(String args[]) {
- (new Timer(this, 5000)).cont();
- }
- }
- </pre>
-
- A timer can be stopped, continued, or reset at any time.
- A timer's state is not stopped while it's calling the
- owner's tick() method.
-
- A timer can be regular or irregular. If in regular mode,
- a timer ticks at the specified interval, regardless of
- how long the owner's tick() method takes. While the timer
- is running, no ticks are ever discarded. That means that if
- the owner's tick() method takes longer than the interval,
- the ticks that would have occurred are delivered immediately.
-
- In irregular mode, a timer starts delaying for exactly
- the specified interval only after the tick() method returns.
-
- Synchronization issues: do not hold the timer's monitor
- while calling any of the Timer operations below otherwise
- the Timer class will deadlock.
-
- @author Patrick Chan
-*/
-
-/*
- Synchronization issues: there are two data structures that
- require locking. A Timer object and the Timer queue
- (described in the TimerThread class). To avoid deadlock,
- the timer queue monitor is always acquired before the timer
- object's monitor. However, the timer queue monitor is acquired
- only if the timer operation will make use of the timer
- queue, e.g. stop().
-
- The class monitor on the class TimerThread severs as the monitor
- to the timer queue.
-
- Possible feature: perhaps a timer should have an associated
- thread priority. The thread that makes the callback temporarily
- takes on that priority before calling the owner's tick() method.
-*/
-
-public class Timer {
- /**
- * This is the owner of the timer. Its tick method is
- * called when the timer ticks.
- */
- public Timeable owner;
-
- /*
- * This is the interval of time in ms.
- */
- long interval;
-
- /*
- * This variable is used for two different purposes.
- * This is done in order to save space.
- * If 'stopped' is true, this variable holds the time
- * that the timer was stopped; otherwise, this variable
- * is used by the TimerThread to determine when the timer
- * should tick.
- */
- long sleepUntil;
-
- /*
- * This is the time remaining before the timer ticks. It
- * is only valid if 'stopped' is true. If the timer is
- * continued, the next tick will happen remaingTime
- * milliseconds later.
- */
- long remainingTime;
-
- /*
- * True iff the timer is in regular mode.
- */
- boolean regular;
-
- /*
- * True iff the timer has been stopped.
- */
- boolean stopped;
-
- /* **************************************************************
- * Timer queue-related variables
- * ************************************************************** */
-
- /*
- * A link to another timer object. This is used while the
- * timer object is enqueued in the timer queue.
- */
- Timer next;
-
- /* **************************************************************
- * Timer methods
- * ************************************************************** */
-
- /*
- * This variable holds a handle to the TimerThread class for
- * the purpose of getting at the class monitor. The reason
- * why Class.forName("TimerThread") is not used is because it
- * doesn't appear to work when loaded via a net class loader.
- */
- static TimerThread timerThread = null;
-
- /**
- * Creates a timer object that is owned by 'owner' and
- * with the interval 'interval' milliseconds. The new timer
- * object is stopped and is regular. getRemainingTime()
- * return 'interval' at this point. getStopTime() returns
- * the time this object was created.
- * @param owner owner of the timer object
- * @param interval interval of the timer in milliseconds
- */
- public Timer(Timeable owner, long interval) {
- this.owner = owner;
- this.interval = interval;
- remainingTime = interval;
- regular = true;
- sleepUntil = System.currentTimeMillis();
- stopped = true;
- synchronized (getClass()) {
- if (timerThread == null) {
- timerThread = new TimerThread();
- }
- }
- }
-
- /**
- * Returns true if this timer is stopped.
- */
- public synchronized boolean isStopped() {
- return stopped;
- }
-
- /**
- * Stops the timer. The amount of time the timer has already
- * delayed is saved so if the timer is continued, it will only
- * delay for the amount of time remaining.
- * Note that even after stopping a timer, one more tick may
- * still occur.
- * This method is MT-safe; i.e. it is synchronized but for
- * implementation reasons, the synchronized modifier cannot
- * be included in the method declaration.
- */
- public void stop() {
- long now = System.currentTimeMillis();
-
- synchronized (timerThread) {
- synchronized (this) {
- if (!stopped) {
- TimerThread.dequeue(this);
- remainingTime = Math.max(0, sleepUntil - now);
- sleepUntil = now; // stop time
- stopped = true;
- }
- }
- }
- }
-
- /**
- * Continue the timer. The next tick will come at getRemainingTime()
- * milliseconds later. If the timer is not stopped, this
- * call will be a no-op.
- * This method is MT-safe; i.e. it is synchronized but for
- * implementation reasons, the synchronized modifier cannot
- * be included in the method declaration.
- */
- public void cont() {
- synchronized (timerThread) {
- synchronized (this) {
- if (stopped) {
- // The TimerTickThread avoids requeuing the
- // timer only if the sleepUntil value has changed.
- // The following guarantees that the sleepUntil
- // value will be different; without this guarantee,
- // it's theoretically possible for the timer to be
- // inserted twice.
- sleepUntil = Math.max(sleepUntil + 1,
- System.currentTimeMillis() + remainingTime);
- TimerThread.enqueue(this);
- stopped = false;
- }
- }
- }
- }
-
- /**
- * Resets the timer's remaining time to the timer's interval.
- * If the timer's running state is not altered.
- */
- public void reset() {
- synchronized (timerThread) {
- synchronized (this) {
- setRemainingTime(interval);
- }
- }
- }
-
- /**
- * Returns the time at which the timer was last stopped. The
- * return value is valid only if the timer is stopped.
- */
- public synchronized long getStopTime() {
- return sleepUntil;
- }
-
- /**
- * Returns the timer's interval.
- */
- public synchronized long getInterval() {
- return interval;
- }
-
- /**
- * Changes the timer's interval. The new interval setting
- * does not take effect until after the next tick.
- * This method does not alter the remaining time or the
- * running state of the timer.
- * @param interval new interval of the timer in milliseconds
- */
- public synchronized void setInterval(long interval) {
- this.interval = interval;
- }
-
- /**
- * Returns the remaining time before the timer's next tick.
- * The return value is valid only if timer is stopped.
- */
- public synchronized long getRemainingTime() {
- return remainingTime;
- }
-
- /**
- * Sets the remaining time before the timer's next tick.
- * This method does not alter the timer's running state.
- * This method is MT-safe; i.e. it is synchronized but for
- * implementation reasons, the synchronized modifier cannot
- * be included in the method declaration.
- * @param time new remaining time in milliseconds.
- */
- public void setRemainingTime(long time) {
- synchronized (timerThread) {
- synchronized (this) {
- if (stopped) {
- remainingTime = time;
- } else {
- stop();
- remainingTime = time;
- cont();
- }
- }
- }
- }
-
- /**
- * In regular mode, a timer ticks at the specified interval,
- * regardless of how long the owner's tick() method takes.
- * While the timer is running, no ticks are ever discarded.
- * That means that if the owner's tick() method takes longer
- * than the interval, the ticks that would have occurred are
- * delivered immediately.
- *
- * In irregular mode, a timer starts delaying for exactly
- * the specified interval only after the tick() method returns.
- */
- public synchronized void setRegular(boolean regular) {
- this.regular = regular;
- }
-
- /*
- * This method is used only for testing purposes.
- */
- protected Thread getTimerThread() {
- return TimerThread.timerThread;
- }
-}
-
-
-/*
-
-This class implements the timer queue and is exclusively used by the
-Timer class. There are only two methods exported to the Timer class -
-enqueue, for inserting a timer into queue and dequeue, for removing
-a timer from the queue.
-
-A timer in the timer queue is awaiting a tick. When a timer is to be
-ticked, it is removed from the timer queue before the owner's tick()
-method is called.
-
-A single timer thread manages the timer queue. This timer thread
-looks at the head of the timer queue and delays until it's time for
-the timer to tick. When the time comes, the timer thread creates a
-callback thread to call the timer owner's tick() method. The timer
-thread then processes the next timer in the queue.
-
-When a timer is inserted at the head of the queue, the timer thread is
-notified. This causes the timer thread to prematurely wake up and
-process the new head of the queue.
-
-*/
-
-class TimerThread extends Thread {
- /*
- * Set to true to get debugging output.
- */
- public static boolean debug = false;
-
- /*
- * This is a handle to the thread managing the thread queue.
- */
- static TimerThread timerThread;
-
- /*
- * This flag is set if the timer thread has been notified
- * while it was in the timed wait. This flag allows the
- * timer thread to tell whether or not the wait completed.
- */
- static boolean notified = false;
-
- protected TimerThread() {
- super("TimerThread");
- timerThread = this;
- start();
- }
-
- public synchronized void run() {
- while (true) {
- long delay;
-
- while (timerQueue == null) {
- try {
- wait();
- } catch (InterruptedException ex) {
- // Just drop through and check timerQueue.
- }
- }
- notified = false;
- delay = timerQueue.sleepUntil - System.currentTimeMillis();
- if (delay > 0) {
- try {
- wait(delay);
- } catch (InterruptedException ex) {
- // Just drop through.
- }
- }
- // remove from timer queue.
- if (!notified) {
- Timer timer = timerQueue;
- timerQueue = timerQueue.next;
- TimerTickThread thr = TimerTickThread.call(
- timer, timer.sleepUntil);
- if (debug) {
- long delta = (System.currentTimeMillis() - timer.sleepUntil);
- System.out.println("tick(" + thr.getName() + ","
- + timer.interval + ","+delta+ ")");
- if (delta > 250) {
- System.out.println("*** BIG DELAY ***");
- }
- }
- }
- }
- }
-
- /* *******************************************************
- Timer Queue
- ******************************************************* */
-
- /*
- * The timer queue is a queue of timers waiting to tick.
- */
- static Timer timerQueue = null;
-
- /*
- * Uses timer.sleepUntil to determine where in the queue
- * to insert the timer object.
- * A new ticker thread is created only if the timer
- * is inserted at the beginning of the queue.
- * The timer must not already be in the queue.
- * Assumes the caller has the TimerThread monitor.
- */
- static protected void enqueue(Timer timer) {
- Timer prev = null;
- Timer cur = timerQueue;
-
- if (cur == null || timer.sleepUntil <= cur.sleepUntil) {
- // insert at front of queue
- timer.next = timerQueue;
- timerQueue = timer;
- notified = true;
- timerThread.notify();
- } else {
- do {
- prev = cur;
- cur = cur.next;
- } while (cur != null && timer.sleepUntil > cur.sleepUntil);
- // insert or append to the timer queue
- timer.next = cur;
- prev.next = timer;
- }
- if (debug) {
- long now = System.currentTimeMillis();
-
- System.out.print(Thread.currentThread().getName()
- + ": enqueue " + timer.interval + ": ");
- cur = timerQueue;
- while(cur != null) {
- long delta = cur.sleepUntil - now;
- System.out.print(cur.interval + "(" + delta + ") ");
- cur = cur.next;
- }
- System.out.println();
- }
- }
-
- /*
- * If the timer is not in the queue, returns false;
- * otherwise removes the timer from the timer queue and returns true.
- * Assumes the caller has the TimerThread monitor.
- */
- static protected boolean dequeue(Timer timer) {
- Timer prev = null;
- Timer cur = timerQueue;
-
- while (cur != null && cur != timer) {
- prev = cur;
- cur = cur.next;
- }
- if (cur == null) {
- if (debug) {
- System.out.println(Thread.currentThread().getName()
- + ": dequeue " + timer.interval + ": no-op");
- }
- return false;
- } if (prev == null) {
- timerQueue = timer.next;
- notified = true;
- timerThread.notify();
- } else {
- prev.next = timer.next;
- }
- timer.next = null;
- if (debug) {
- long now = System.currentTimeMillis();
-
- System.out.print(Thread.currentThread().getName()
- + ": dequeue " + timer.interval + ": ");
- cur = timerQueue;
- while(cur != null) {
- long delta = cur.sleepUntil - now;
- System.out.print(cur.interval + "(" + delta + ") ");
- cur = cur.next;
- }
- System.out.println();
- }
- return true;
- }
-
- /*
- * Inserts the timer back into the queue. This method
- * is used by a callback thread after it has called the
- * timer owner's tick() method. This method recomputes
- * the sleepUntil field.
- * Assumes the caller has the TimerThread and Timer monitor.
- */
- protected static void requeue(Timer timer) {
- if (!timer.stopped) {
- long now = System.currentTimeMillis();
- if (timer.regular) {
- timer.sleepUntil += timer.interval;
- } else {
- timer.sleepUntil = now + timer.interval;
- }
- enqueue(timer);
- } else if (debug) {
- System.out.println(Thread.currentThread().getName()
- + ": requeue " + timer.interval + ": no-op");
- }
- }
-}
-
-/*
-
-This class implements a simple thread whose only purpose is to call a
-timer owner's tick() method. A small fixed-sized pool of threads is
-maintained and is protected by the class monitor. If the pool is
-exhausted, a new thread is temporarily created and destroyed when
-done.
-
-A thread that's in the pool waits on it's own monitor. When the
-thread is retrieved from the pool, the retriever notifies the thread's
-monitor.
-
-*/
-
-class TimerTickThread extends Thread {
- /*
- * Maximum size of the thread pool.
- */
- static final int MAX_POOL_SIZE = 3;
-
- /*
- * Number of threads in the pool.
- */
- static int curPoolSize = 0;
-
- /*
- * The pool of timer threads.
- */
- static TimerTickThread pool = null;
-
- /*
- * Is used when linked into the thread pool.
- */
- TimerTickThread next = null;
-
- /*
- * This is the handle to the timer whose owner's
- * tick() method will be called.
- */
- Timer timer;
-
- /*
- * The value of a timer's sleepUntil value is captured here.
- * This is used to determine whether or not the timer should
- * be reinserted into the queue. If the timer's sleepUntil
- * value has changed, the timer is not reinserted.
- */
- long lastSleepUntil;
-
- /*
- * Creates a new callback thread to call the timer owner's
- * tick() method. A thread is taken from the pool if one
- * is available, otherwise, a new thread is created.
- * The thread handle is returned.
- */
- protected static synchronized TimerTickThread call(
- Timer timer, long sleepUntil) {
- TimerTickThread thread = pool;
-
- if (thread == null) {
- // create one.
- thread = new TimerTickThread();
- thread.timer = timer;
- thread.lastSleepUntil = sleepUntil;
- thread.start();
- } else {
- pool = pool.next;
- thread.timer = timer;
- thread.lastSleepUntil = sleepUntil;
- synchronized (thread) {
- thread.notify();
- }
- }
- return thread;
- }
-
- /*
- * Returns false if the thread should simply exit;
- * otherwise the thread is returned the pool, where
- * it waits to be notified. (I did try to use the
- * class monitor but the time between the notify
- * and breaking out of the wait seemed to take
- * significantly longer; need to look into this later.)
- */
- private boolean returnToPool() {
- synchronized (getClass()) {
- if (curPoolSize >= MAX_POOL_SIZE) {
- return false;
- }
- next = pool;
- pool = this;
- curPoolSize++;
- timer = null;
- }
- while (timer == null) {
- synchronized (this) {
- try {
- wait();
- } catch (InterruptedException ex) {
- // Just drop through and retest timer.
- }
- }
- }
- synchronized (getClass()) {
- curPoolSize--;
- }
- return true;
- }
-
- public void run() {
- do {
- timer.owner.tick(timer);
- synchronized (TimerThread.timerThread) {
- synchronized (timer) {
- if (lastSleepUntil == timer.sleepUntil) {
- TimerThread.requeue(timer);
- }
- }
- }
- } while (returnToPool());
- }
-}
--- a/jdk/src/share/classes/sun/misc/UUDecoder.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/misc/UUDecoder.java Wed Jul 05 19:46:31 2017 +0200
@@ -123,7 +123,7 @@
throws IOException {
int i, c1, c2, c3, c4;
int a, b, c;
- StringBuffer x = new StringBuffer();
+ StringBuilder x = new StringBuilder();
for (i = 0; i < 4; i++) {
c1 = inStream.read();
@@ -152,7 +152,7 @@
*/
protected void decodeBufferPrefix(PushbackInputStream inStream, OutputStream outStream) throws IOException {
int c;
- StringBuffer q = new StringBuffer(32);
+ StringBuilder q = new StringBuilder(32);
String r;
boolean sawNewLine;
--- a/jdk/src/share/classes/sun/net/TransferProtocolClient.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/net/TransferProtocolClient.java Wed Jul 05 19:46:31 2017 +0200
@@ -53,7 +53,7 @@
* number. Returns -1 on failure.
*/
public int readServerResponse() throws IOException {
- StringBuffer replyBuf = new StringBuffer(32);
+ StringBuilder replyBuf = new StringBuilder(32);
int c;
int continuingCode = -1;
int code;
--- a/jdk/src/share/classes/sun/net/ftp/impl/FtpClient.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/net/ftp/impl/FtpClient.java Wed Jul 05 19:46:31 2017 +0200
@@ -408,7 +408,7 @@
* number. Returns -1 on failure.
*/
private int readServerResponse() throws IOException {
- StringBuffer replyBuf = new StringBuffer(32);
+ StringBuilder replyBuf = new StringBuilder(32);
int c;
int continuingCode = -1;
int code;
@@ -1050,7 +1050,7 @@
// keep the welcome message around so we can
// put it in the resulting HTML page.
String l;
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
for (int i = 0; i < serverResponse.size(); i++) {
l = serverResponse.elementAt(i);
if (l != null) {
@@ -1095,7 +1095,7 @@
// keep the welcome message around so we can
// put it in the resulting HTML page.
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
if (serverResponse != null) {
for (String l : serverResponse) {
if (l != null) {
@@ -1493,7 +1493,7 @@
* So we need to remove the 1st and last line
*/
Vector<String> resp = getResponseStrings();
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
for (int i = 1; i < resp.size() - 1; i++) {
sb.append(resp.get(i));
}
@@ -1985,7 +1985,7 @@
* by the server.
*/
public String getLastResponseString() {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
if (serverResponse != null) {
for (String l : serverResponse) {
if (l != null) {
@@ -2188,7 +2188,7 @@
}
// on multiple lines answers, like the ones above, remove 1st and last
// line, concat the the others.
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
for (int i = 1; i < resp.size() - 1; i++) {
sb.append(resp.get(i).substring(3));
}
--- a/jdk/src/share/classes/sun/net/www/MimeEntry.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/net/www/MimeEntry.java Wed Jul 05 19:46:31 2017 +0200
@@ -281,52 +281,52 @@
}
public synchronized String toProperty() {
- StringBuffer buf = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
String separator = "; ";
boolean needSeparator = false;
int action = getAction();
if (action != MimeEntry.UNKNOWN) {
- buf.append("action=" + actionKeywords[action]);
+ sb.append("action=" + actionKeywords[action]);
needSeparator = true;
}
String command = getLaunchString();
if (command != null && command.length() > 0) {
if (needSeparator) {
- buf.append(separator);
+ sb.append(separator);
}
- buf.append("application=" + command);
+ sb.append("application=" + command);
needSeparator = true;
}
if (getImageFileName() != null) {
if (needSeparator) {
- buf.append(separator);
+ sb.append(separator);
}
- buf.append("icon=" + getImageFileName());
+ sb.append("icon=" + getImageFileName());
needSeparator = true;
}
String extensions = getExtensionsAsList();
if (extensions.length() > 0) {
if (needSeparator) {
- buf.append(separator);
+ sb.append(separator);
}
- buf.append("file_extensions=" + extensions);
+ sb.append("file_extensions=" + extensions);
needSeparator = true;
}
String description = getDescription();
if (description != null && !description.equals(getType())) {
if (needSeparator) {
- buf.append(separator);
+ sb.append(separator);
}
- buf.append("description=" + description);
+ sb.append("description=" + description);
}
- return buf.toString();
+ return sb.toString();
}
public String toString() {
--- a/jdk/src/share/classes/sun/net/www/http/HttpClient.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/net/www/http/HttpClient.java Wed Jul 05 19:46:31 2017 +0200
@@ -558,7 +558,7 @@
// Do not use URLStreamHandler.toExternalForm as the fragment
// should not be part of the RequestURI. It should be an
// absolute URI which does not have a fragment part.
- StringBuffer result = new StringBuffer(128);
+ StringBuilder result = new StringBuilder(128);
result.append(url.getProtocol());
result.append(":");
if (url.getAuthority() != null && url.getAuthority().length() > 0) {
--- a/jdk/src/share/classes/sun/net/www/protocol/file/FileURLConnection.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/net/www/protocol/file/FileURLConnection.java Wed Jul 05 19:46:31 2017 +0200
@@ -191,7 +191,7 @@
if (isDirectory) {
FileNameMap map = java.net.URLConnection.getFileNameMap();
- StringBuffer buf = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
if (files == null) {
throw new FileNotFoundException(filename);
@@ -201,11 +201,11 @@
for (int i = 0 ; i < files.size() ; i++) {
String fileName = files.get(i);
- buf.append(fileName);
- buf.append("\n");
+ sb.append(fileName);
+ sb.append("\n");
}
// Put it into a (default) locale-specific byte-stream.
- is = new ByteArrayInputStream(buf.toString().getBytes());
+ is = new ByteArrayInputStream(sb.toString().getBytes());
} else {
throw new FileNotFoundException(filename);
}
--- a/jdk/src/share/classes/sun/net/www/protocol/http/DigestAuthentication.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/net/www/protocol/http/DigestAuthentication.java Wed Jul 05 19:46:31 2017 +0200
@@ -532,7 +532,7 @@
}
byte[] digest = md.digest();
- StringBuffer res = new StringBuffer(digest.length * 2);
+ StringBuilder res = new StringBuilder(digest.length * 2);
for (int i = 0; i < digest.length; i++) {
int hashchar = ((digest[i] >>> 4) & 0xf);
res.append(charArray[hashchar]);
--- a/jdk/src/share/classes/sun/nio/ch/ServerSocketChannelImpl.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/nio/ch/ServerSocketChannelImpl.java Wed Jul 05 19:46:31 2017 +0200
@@ -382,7 +382,7 @@
}
public String toString() {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
sb.append(this.getClass().getName());
sb.append('[');
if (!isOpen()) {
--- a/jdk/src/share/classes/sun/nio/ch/SocketChannelImpl.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/nio/ch/SocketChannelImpl.java Wed Jul 05 19:46:31 2017 +0200
@@ -983,7 +983,7 @@
@Override
public String toString() {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
sb.append(this.getClass().getSuperclass().getName());
sb.append('[');
if (!isOpen())
--- a/jdk/src/share/classes/sun/print/PSPrinterJob.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/print/PSPrinterJob.java Wed Jul 05 19:46:31 2017 +0200
@@ -1269,7 +1269,7 @@
CharsetString cs = acs[i];
CharsetEncoder fontCS = cs.fontDescriptor.encoder;
- StringBuffer nativeStr = new StringBuffer();
+ StringBuilder nativeStr = new StringBuilder();
byte[] strSeg = new byte[cs.length * 2];
int len = 0;
try {
--- a/jdk/src/share/classes/sun/reflect/MethodAccessorGenerator.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/reflect/MethodAccessorGenerator.java Wed Jul 05 19:46:31 2017 +0200
@@ -751,14 +751,14 @@
}
private String buildInternalSignature() {
- StringBuffer buf = new StringBuffer();
- buf.append("(");
+ StringBuilder sb = new StringBuilder();
+ sb.append("(");
for (int i = 0; i < parameterTypes.length; i++) {
- buf.append(getClassName(parameterTypes[i], true));
+ sb.append(getClassName(parameterTypes[i], true));
}
- buf.append(")");
- buf.append(getClassName(returnType, true));
- return buf.toString();
+ sb.append(")");
+ sb.append(getClassName(returnType, true));
+ return sb.toString();
}
private static synchronized String generateName(boolean isConstructor,
--- a/jdk/src/share/classes/sun/rmi/server/Activation.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/rmi/server/Activation.java Wed Jul 05 19:46:31 2017 +0200
@@ -1239,7 +1239,7 @@
checkArgs(desc, argv);
if (debugExec) {
- StringBuffer sb = new StringBuffer(argv[0]);
+ StringBuilder sb = new StringBuilder(argv[0]);
int j;
for (j = 1; j < argv.length; j++) {
sb.append(' ');
--- a/jdk/src/share/classes/sun/rmi/server/LoaderHandler.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/rmi/server/LoaderHandler.java Wed Jul 05 19:46:31 2017 +0200
@@ -793,7 +793,7 @@
} else if (urls.length == 1) {
return urls[0].toExternalForm();
} else {
- StringBuffer path = new StringBuffer(urls[0].toExternalForm());
+ StringBuilder path = new StringBuilder(urls[0].toExternalForm());
for (int i = 1; i < urls.length; i++) {
path.append(' ');
path.append(urls[i].toExternalForm());
--- a/jdk/src/share/classes/sun/rmi/server/Util.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/rmi/server/Util.java Wed Jul 05 19:46:31 2017 +0200
@@ -391,7 +391,7 @@
* the definition of a "method descriptor".
*/
private static String getMethodNameAndDescriptor(Method m) {
- StringBuffer desc = new StringBuffer(m.getName());
+ StringBuilder desc = new StringBuilder(m.getName());
desc.append('(');
Class<?>[] paramTypes = m.getParameterTypes();
for (int i = 0; i < paramTypes.length; i++) {
--- a/jdk/src/share/classes/sun/security/acl/AclImpl.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/acl/AclImpl.java Wed Jul 05 19:46:31 2017 +0200
@@ -253,7 +253,7 @@
* ACL.
*/
public String toString() {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
Enumeration<AclEntry> entries = entries();
while (entries.hasMoreElements()) {
AclEntry entry = entries.nextElement();
--- a/jdk/src/share/classes/sun/security/jgss/GSSCredentialImpl.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/jgss/GSSCredentialImpl.java Wed Jul 05 19:46:31 2017 +0200
@@ -636,29 +636,29 @@
}
GSSCredentialSpi element = null;
- StringBuffer buffer = new StringBuffer("[GSSCredential: ");
+ StringBuilder sb = new StringBuilder("[GSSCredential: ");
Object[] elements = hashtable.entrySet().toArray();
for (int i = 0; i < elements.length; i++) {
try {
- buffer.append('\n');
+ sb.append('\n');
element = (GSSCredentialSpi)
((Map.Entry)elements[i]).getValue();
- buffer.append(element.getName());
- buffer.append(' ');
- buffer.append(element.getMechanism());
- buffer.append(element.isInitiatorCredential() ?
- " Initiate" : "");
- buffer.append(element.isAcceptorCredential() ?
- " Accept" : "");
- buffer.append(" [");
- buffer.append(element.getClass());
- buffer.append(']');
+ sb.append(element.getName());
+ sb.append(' ');
+ sb.append(element.getMechanism());
+ sb.append(element.isInitiatorCredential() ?
+ " Initiate" : "");
+ sb.append(element.isAcceptorCredential() ?
+ " Accept" : "");
+ sb.append(" [");
+ sb.append(element.getClass());
+ sb.append(']');
} catch (GSSException e) {
// skip to next element
}
}
- buffer.append(']');
- return buffer.toString();
+ sb.append(']');
+ return sb.toString();
}
static class SearchKey {
--- a/jdk/src/share/classes/sun/security/jgss/GSSHeader.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/jgss/GSSHeader.java Wed Jul 05 19:46:31 2017 +0200
@@ -327,7 +327,7 @@
private String getHexBytes(byte[] bytes, int len)
throws IOException {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
for (int i = 0; i < len; i++) {
int b1 = (bytes[i]>>4) & 0x0f;
--- a/jdk/src/share/classes/sun/security/jgss/GSSToken.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/jgss/GSSToken.java Wed Jul 05 19:46:31 2017 +0200
@@ -216,7 +216,7 @@
}
public static final String getHexBytes(byte[] bytes, int pos, int len) {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
for (int i = pos; i < (pos+len); i++) {
int b1 = (bytes[i]>>4) & 0x0f;
int b2 = bytes[i] & 0x0f;
--- a/jdk/src/share/classes/sun/security/jgss/ProviderList.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/jgss/ProviderList.java Wed Jul 05 19:46:31 2017 +0200
@@ -536,12 +536,12 @@
// For debugging
public String toString() {
- StringBuffer buf = new StringBuffer("<");
- buf.append(p.getName());
- buf.append(", ");
- buf.append(oid);
- buf.append(">");
- return buf.toString();
+ StringBuilder sb = new StringBuilder("<");
+ sb.append(p.getName());
+ sb.append(", ");
+ sb.append(oid);
+ sb.append(">");
+ return sb.toString();
}
}
}
--- a/jdk/src/share/classes/sun/security/jgss/TokenTracker.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/jgss/TokenTracker.java Wed Jul 05 19:46:31 2017 +0200
@@ -336,19 +336,19 @@
}
public String toString() {
- StringBuffer buf = new StringBuffer("TokenTracker: ");
- buf.append(" initNumber=").append(initNumber);
- buf.append(" windowStart=").append(windowStart);
- buf.append(" expectedNumber=").append(expectedNumber);
- buf.append(" windowStartIndex=").append(windowStartIndex);
- buf.append("\n\tIntervals are: {");
+ StringBuilder sb = new StringBuilder("TokenTracker: ");
+ sb.append(" initNumber=").append(initNumber);
+ sb.append(" windowStart=").append(windowStart);
+ sb.append(" expectedNumber=").append(expectedNumber);
+ sb.append(" windowStartIndex=").append(windowStartIndex);
+ sb.append("\n\tIntervals are: {");
for (int i = 0; i < list.size(); i++) {
if (i != 0)
- buf.append(", ");
- buf.append(list.get(i).toString());
+ sb.append(", ");
+ sb.append(list.get(i).toString());
}
- buf.append('}');
- return buf.toString();
+ sb.append('}');
+ return sb.toString();
}
/**
--- a/jdk/src/share/classes/sun/security/jgss/krb5/InitialToken.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/jgss/krb5/InitialToken.java Wed Jul 05 19:46:31 2017 +0200
@@ -164,15 +164,15 @@
serviceTicket.getServer();
// Cannot use '\"' instead of "\"" in constructor because
// it is interpreted as suggested length!
- StringBuffer buf = new StringBuffer("\"");
- buf.append(delegateTo.getName()).append('\"');
+ StringBuilder sb = new StringBuilder("\"");
+ sb.append(delegateTo.getName()).append('\"');
String realm = delegateTo.getRealmAsString();
- buf.append(" \"krbtgt/").append(realm).append('@');
- buf.append(realm).append('\"');
+ sb.append(" \"krbtgt/").append(realm).append('@');
+ sb.append(realm).append('\"');
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
DelegationPermission perm =
- new DelegationPermission(buf.toString());
+ new DelegationPermission(sb.toString());
sm.checkPermission(perm);
}
--- a/jdk/src/share/classes/sun/security/jgss/krb5/Krb5Context.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/jgss/krb5/Krb5Context.java Wed Jul 05 19:46:31 2017 +0200
@@ -1345,7 +1345,7 @@
private static String getHexBytes(byte[] bytes, int pos, int len) {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
for (int i = 0; i < len; i++) {
int b1 = (bytes[i]>>4) & 0x0f;
--- a/jdk/src/share/classes/sun/security/jgss/wrapper/Krb5Util.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/jgss/wrapper/Krb5Util.java Wed Jul 05 19:46:31 2017 +0200
@@ -41,9 +41,9 @@
String krbPrinc = name.getKrbName();
int atIndex = krbPrinc.indexOf('@');
String realm = krbPrinc.substring(atIndex + 1);
- StringBuffer buf = new StringBuffer("krbtgt/");
- buf.append(realm).append('@').append(realm);
- return buf.toString();
+ StringBuilder sb = new StringBuilder("krbtgt/");
+ sb.append(realm).append('@').append(realm);
+ return sb.toString();
}
// Perform the Service Permission check using the specified
--- a/jdk/src/share/classes/sun/security/jgss/wrapper/NativeGSSContext.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/jgss/wrapper/NativeGSSContext.java Wed Jul 05 19:46:31 2017 +0200
@@ -139,10 +139,10 @@
if (sm != null) {
String targetStr = targetName.getKrbName();
String tgsStr = Krb5Util.getTGSName(targetName);
- StringBuffer buf = new StringBuffer("\"");
- buf.append(targetStr).append("\" \"");
- buf.append(tgsStr).append('\"');
- String krbPrincPair = buf.toString();
+ StringBuilder sb = new StringBuilder("\"");
+ sb.append(targetStr).append("\" \"");
+ sb.append(tgsStr).append('\"');
+ String krbPrincPair = sb.toString();
SunNativeProvider.debug("Checking DelegationPermission (" +
krbPrincPair + ")");
DelegationPermission perm =
--- a/jdk/src/share/classes/sun/security/krb5/Credentials.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/krb5/Credentials.java Wed Jul 05 19:46:31 2017 +0200
@@ -510,21 +510,21 @@
}
public String toString() {
- StringBuffer buffer = new StringBuffer("Credentials:");
- buffer.append( "\n client=").append(client);
- buffer.append( "\n server=").append(server);
+ StringBuilder sb = new StringBuilder("Credentials:");
+ sb.append( "\n client=").append(client);
+ sb.append( "\n server=").append(server);
if (authTime != null) {
- buffer.append("\n authTime=").append(authTime);
+ sb.append("\n authTime=").append(authTime);
}
if (startTime != null) {
- buffer.append("\n startTime=").append(startTime);
+ sb.append("\n startTime=").append(startTime);
}
- buffer.append( "\n endTime=").append(endTime);
- buffer.append( "\n renewTill=").append(renewTill);
- buffer.append( "\n flags=").append(flags);
- buffer.append( "\nEType (skey)=").append(key.getEType());
- buffer.append( "\n (tkt key)=").append(ticket.encPart.eType);
- return buffer.toString();
+ sb.append( "\n endTime=").append(endTime);
+ sb.append( "\n renewTill=").append(renewTill);
+ sb.append( "\n flags=").append(flags);
+ sb.append( "\nEType (skey)=").append(key.getEType());
+ sb.append( "\n (tkt key)=").append(ticket.encPart.eType);
+ return sb.toString();
}
}
--- a/jdk/src/share/classes/sun/security/krb5/KrbException.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/krb5/KrbException.java Wed Jul 05 19:46:31 2017 +0200
@@ -96,7 +96,7 @@
public String krbErrorMessage() {
- StringBuffer strbuf = new StringBuffer("krb_error " + returnCode);
+ StringBuilder strbuf = new StringBuilder("krb_error " + returnCode);
String msg = getMessage();
if (msg != null) {
strbuf.append(" ");
@@ -112,7 +112,7 @@
* If the error code is 0 then the first half is skipped.
*/
public String getMessage() {
- StringBuffer message = new StringBuffer();
+ StringBuilder message = new StringBuilder();
int returnCode = returnCode();
if (returnCode != 0) {
message.append(returnCodeMessage());
--- a/jdk/src/share/classes/sun/security/krb5/PrincipalName.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/krb5/PrincipalName.java Wed Jul 05 19:46:31 2017 +0200
@@ -480,7 +480,7 @@
}
public String getPrincipalNameAsString() {
- StringBuffer temp = new StringBuffer(nameStrings[0]);
+ StringBuilder temp = new StringBuilder(nameStrings[0]);
for (int i = 1; i < nameStrings.length; i++)
temp.append(nameStrings[i]);
return temp.toString();
@@ -521,7 +521,7 @@
public String getSalt() {
if (salt == null) {
- StringBuffer salt = new StringBuffer();
+ StringBuilder salt = new StringBuilder();
salt.append(nameRealm.toString());
for (int i = 0; i < nameStrings.length; i++) {
salt.append(nameStrings[i]);
@@ -532,7 +532,7 @@
}
public String toString() {
- StringBuffer str = new StringBuffer();
+ StringBuilder str = new StringBuilder();
for (int i = 0; i < nameStrings.length; i++) {
if (i > 0)
str.append("/");
@@ -544,7 +544,7 @@
}
public String getNameString() {
- StringBuffer str = new StringBuffer();
+ StringBuilder str = new StringBuilder();
for (int i = 0; i < nameStrings.length; i++) {
if (i > 0)
str.append("/");
--- a/jdk/src/share/classes/sun/security/krb5/internal/EncTicketPart.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/krb5/internal/EncTicketPart.java Wed Jul 05 19:46:31 2017 +0200
@@ -117,7 +117,7 @@
private static String getHexBytes(byte[] bytes, int len)
throws IOException {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
for (int i = 0; i < len; i++) {
int b1 = (bytes[i] >> 4) & 0x0f;
--- a/jdk/src/share/classes/sun/security/krb5/internal/TicketFlags.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/krb5/internal/TicketFlags.java Wed Jul 05 19:46:31 2017 +0200
@@ -137,7 +137,7 @@
* Returns the string representative of ticket flags.
*/
public String toString() {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
boolean[] flags = toBooleanArray();
for (int i = 0; i < flags.length; i++) {
if (flags[i] == true) {
--- a/jdk/src/share/classes/sun/security/krb5/internal/crypto/EType.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/krb5/internal/crypto/EType.java Wed Jul 05 19:46:31 2017 +0200
@@ -269,7 +269,7 @@
}
int len = list.size();
if (len <= 0) {
- StringBuffer keystr = new StringBuffer();
+ StringBuilder keystr = new StringBuilder();
for (int i = 0; i < keys.length; i++) {
keystr.append(toString(keys[i].getEType()));
keystr.append(" ");
--- a/jdk/src/share/classes/sun/security/krb5/internal/crypto/dk/DkCrypto.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/krb5/internal/crypto/dk/DkCrypto.java Wed Jul 05 19:46:31 2017 +0200
@@ -636,7 +636,7 @@
// Routines used for debugging
static String bytesToString(byte[] digest) {
// Get character representation of digest
- StringBuffer digestString = new StringBuffer();
+ StringBuilder digestString = new StringBuilder();
for (int i = 0; i < digest.length; i++) {
if ((digest[i] & 0x000000ff) < 0x10) {
--- a/jdk/src/share/classes/sun/security/krb5/internal/ktab/KeyTabEntry.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/krb5/internal/ktab/KeyTabEntry.java Wed Jul 05 19:46:31 2017 +0200
@@ -73,7 +73,7 @@
}
public String getKeyString() {
- StringBuffer sb = new StringBuffer("0x");
+ StringBuilder sb = new StringBuilder("0x");
for (int i = 0; i < keyblock.length; i++) {
sb.append(String.format("%02x", keyblock[i]&0xff));
}
--- a/jdk/src/share/classes/sun/security/pkcs/PKCS9Attribute.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/pkcs/PKCS9Attribute.java Wed Jul 05 19:46:31 2017 +0200
@@ -790,26 +790,26 @@
* Returns a string representation of this attribute.
*/
public String toString() {
- StringBuffer buf = new StringBuffer(100);
+ StringBuilder sb = new StringBuilder(100);
- buf.append("[");
+ sb.append("[");
if (index == -1) {
- buf.append(oid.toString());
+ sb.append(oid.toString());
} else {
- buf.append(OID_NAME_TABLE.get(PKCS9_OIDS[index]));
+ sb.append(OID_NAME_TABLE.get(PKCS9_OIDS[index]));
}
- buf.append(": ");
+ sb.append(": ");
if (index == -1 || SINGLE_VALUED[index]) {
if (value instanceof byte[]) { // special case for octet string
HexDumpEncoder hexDump = new HexDumpEncoder();
- buf.append(hexDump.encodeBuffer((byte[]) value));
+ sb.append(hexDump.encodeBuffer((byte[]) value));
} else {
- buf.append(value.toString());
+ sb.append(value.toString());
}
- buf.append("]");
- return buf.toString();
+ sb.append("]");
+ return sb.toString();
} else { // multi-valued
boolean first = true;
Object[] values = (Object[]) value;
@@ -818,11 +818,11 @@
if (first)
first = false;
else
- buf.append(", ");
+ sb.append(", ");
- buf.append(values[j].toString());
+ sb.append(values[j].toString());
}
- return buf.toString();
+ return sb.toString();
}
}
@@ -857,7 +857,7 @@
private void throwTagException(Byte tag)
throws IOException {
Byte[] expectedTags = PKCS9_VALUE_TAGS[index];
- StringBuffer msg = new StringBuffer(100);
+ StringBuilder msg = new StringBuilder(100);
msg.append("Value of attribute ");
msg.append(oid.toString());
msg.append(" (");
--- a/jdk/src/share/classes/sun/security/pkcs/PKCS9Attributes.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/pkcs/PKCS9Attributes.java Wed Jul 05 19:46:31 2017 +0200
@@ -323,8 +323,8 @@
* Returns the PKCS9 block in a printable string form.
*/
public String toString() {
- StringBuffer buf = new StringBuffer(200);
- buf.append("PKCS9 Attributes: [\n\t");
+ StringBuilder sb = new StringBuilder(200);
+ sb.append("PKCS9 Attributes: [\n\t");
ObjectIdentifier oid;
PKCS9Attribute value;
@@ -339,14 +339,14 @@
if (first)
first = false;
else
- buf.append(";\n\t");
+ sb.append(";\n\t");
- buf.append(value.toString());
+ sb.append(value.toString());
}
- buf.append("\n\t] (end PKCS9 Attributes)");
+ sb.append("\n\t] (end PKCS9 Attributes)");
- return buf.toString();
+ return sb.toString();
}
/**
--- a/jdk/src/share/classes/sun/security/pkcs/SigningCertificateInfo.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/pkcs/SigningCertificateInfo.java Wed Jul 05 19:46:31 2017 +0200
@@ -92,15 +92,15 @@
}
public String toString() {
- StringBuffer buffer = new StringBuffer();
- buffer.append("[\n");
+ StringBuilder sb = new StringBuilder();
+ sb.append("[\n");
for (int i = 0; i < certId.length; i++) {
- buffer.append(certId[i].toString());
+ sb.append(certId[i].toString());
}
// format policies as a string
- buffer.append("\n]");
+ sb.append("\n]");
- return buffer.toString();
+ return sb.toString();
}
public void parse(byte[] bytes) throws IOException {
@@ -151,17 +151,17 @@
}
public String toString() {
- StringBuffer buffer = new StringBuffer();
- buffer.append("[\n\tCertificate hash (SHA-1):\n");
+ StringBuilder sb = new StringBuilder();
+ sb.append("[\n\tCertificate hash (SHA-1):\n");
if (hexDumper == null) {
hexDumper = new HexDumpEncoder();
}
- buffer.append(hexDumper.encode(certHash));
+ sb.append(hexDumper.encode(certHash));
if (issuer != null && serialNumber != null) {
- buffer.append("\n\tIssuer: " + issuer + "\n");
- buffer.append("\t" + serialNumber);
+ sb.append("\n\tIssuer: " + issuer + "\n");
+ sb.append("\t" + serialNumber);
}
- buffer.append("\n]");
- return buffer.toString();
+ sb.append("\n]");
+ return sb.toString();
}
}
--- a/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_AES_CTR_PARAMS.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_AES_CTR_PARAMS.java Wed Jul 05 19:46:31 2017 +0200
@@ -50,17 +50,17 @@
}
public String toString() {
- StringBuffer buffer = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
- buffer.append(Constants.INDENT);
- buffer.append("ulCounterBits: ");
- buffer.append(ulCounterBits);
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("ulCounterBits: ");
+ sb.append(ulCounterBits);
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("cb: ");
- buffer.append(Functions.toHexString(cb));
+ sb.append(Constants.INDENT);
+ sb.append("cb: ");
+ sb.append(Functions.toHexString(cb));
- return buffer.toString();
+ return sb.toString();
}
}
--- a/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_DATE.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_DATE.java Wed Jul 05 19:46:31 2017 +0200
@@ -122,16 +122,16 @@
* @return the string representation of CK_DATE
*/
public String toString() {
- StringBuffer buffer = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
- buffer.append(new String(day));
- buffer.append('.');
- buffer.append(new String(month));
- buffer.append('.');
- buffer.append(new String(year));
- buffer.append(" (DD.MM.YYYY)");
+ sb.append(new String(day));
+ sb.append('.');
+ sb.append(new String(month));
+ sb.append('.');
+ sb.append(new String(year));
+ sb.append(" (DD.MM.YYYY)");
- return buffer.toString();
+ return sb.toString();
}
}
--- a/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_ECDH1_DERIVE_PARAMS.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_ECDH1_DERIVE_PARAMS.java Wed Jul 05 19:46:31 2017 +0200
@@ -105,34 +105,34 @@
* @return the string representation of CK_PKCS5_PBKD2_PARAMS
*/
public String toString() {
- StringBuffer buffer = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
- buffer.append(Constants.INDENT);
- buffer.append("kdf: 0x");
- buffer.append(Functions.toFullHexString(kdf));
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("kdf: 0x");
+ sb.append(Functions.toFullHexString(kdf));
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("pSharedDataLen: ");
- buffer.append(pSharedData.length);
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("pSharedDataLen: ");
+ sb.append(pSharedData.length);
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("pSharedData: ");
- buffer.append(Functions.toHexString(pSharedData));
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("pSharedData: ");
+ sb.append(Functions.toHexString(pSharedData));
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("pPublicDataLen: ");
- buffer.append(pPublicData.length);
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("pPublicDataLen: ");
+ sb.append(pPublicData.length);
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("pPublicData: ");
- buffer.append(Functions.toHexString(pPublicData));
+ sb.append(Constants.INDENT);
+ sb.append("pPublicData: ");
+ sb.append(Functions.toHexString(pPublicData));
//buffer.append(Constants.NEWLINE);
- return buffer.toString();
+ return sb.toString();
}
}
--- a/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_ECDH2_DERIVE_PARAMS.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_ECDH2_DERIVE_PARAMS.java Wed Jul 05 19:46:31 2017 +0200
@@ -128,54 +128,54 @@
* @return the string representation of CK_PKCS5_PBKD2_PARAMS
*/
public String toString() {
- StringBuffer buffer = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
- buffer.append(Constants.INDENT);
- buffer.append("kdf: 0x");
- buffer.append(Functions.toFullHexString(kdf));
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("kdf: 0x");
+ sb.append(Functions.toFullHexString(kdf));
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("pSharedDataLen: ");
- buffer.append(pSharedData.length);
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("pSharedDataLen: ");
+ sb.append(pSharedData.length);
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("pSharedData: ");
- buffer.append(Functions.toHexString(pSharedData));
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("pSharedData: ");
+ sb.append(Functions.toHexString(pSharedData));
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("pPublicDataLen: ");
- buffer.append(pPublicData.length);
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("pPublicDataLen: ");
+ sb.append(pPublicData.length);
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("pPublicData: ");
- buffer.append(Functions.toHexString(pPublicData));
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("pPublicData: ");
+ sb.append(Functions.toHexString(pPublicData));
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("ulPrivateDataLen: ");
- buffer.append(ulPrivateDataLen);
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("ulPrivateDataLen: ");
+ sb.append(ulPrivateDataLen);
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("hPrivateData: ");
- buffer.append(hPrivateData);
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("hPrivateData: ");
+ sb.append(hPrivateData);
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("pPublicDataLen2: ");
- buffer.append(pPublicData2.length);
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("pPublicDataLen2: ");
+ sb.append(pPublicData2.length);
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("pPublicData2: ");
- buffer.append(Functions.toHexString(pPublicData2));
+ sb.append(Constants.INDENT);
+ sb.append("pPublicData2: ");
+ sb.append(Functions.toHexString(pPublicData2));
//buffer.append(Constants.NEWLINE);
- return buffer.toString();
+ return sb.toString();
}
}
--- a/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_INFO.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_INFO.java Wed Jul 05 19:46:31 2017 +0200
@@ -131,34 +131,34 @@
* @return the string representation of CK_INFO
*/
public String toString() {
- StringBuffer buffer = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
- buffer.append(Constants.INDENT);
- buffer.append("cryptokiVersion: ");
- buffer.append(cryptokiVersion.toString());
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("cryptokiVersion: ");
+ sb.append(cryptokiVersion.toString());
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("manufacturerID: ");
- buffer.append(new String(manufacturerID));
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("manufacturerID: ");
+ sb.append(new String(manufacturerID));
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("flags: ");
- buffer.append(Functions.toBinaryString(flags));
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("flags: ");
+ sb.append(Functions.toBinaryString(flags));
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("libraryDescription: ");
- buffer.append(new String(libraryDescription));
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("libraryDescription: ");
+ sb.append(new String(libraryDescription));
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("libraryVersion: ");
- buffer.append(libraryVersion.toString());
+ sb.append(Constants.INDENT);
+ sb.append("libraryVersion: ");
+ sb.append(libraryVersion.toString());
//buffer.append(Constants.NEWLINE);
- return buffer.toString() ;
+ return sb.toString() ;
}
}
--- a/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_MECHANISM.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_MECHANISM.java Wed Jul 05 19:46:31 2017 +0200
@@ -143,24 +143,24 @@
* @return the string representation of CK_MECHANISM
*/
public String toString() {
- StringBuffer buffer = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
- buffer.append(Constants.INDENT);
- buffer.append("mechanism: ");
- buffer.append(mechanism);
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("mechanism: ");
+ sb.append(mechanism);
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("pParameter: ");
- buffer.append(pParameter.toString());
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("pParameter: ");
+ sb.append(pParameter.toString());
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("ulParameterLen: ??");
+ sb.append(Constants.INDENT);
+ sb.append("ulParameterLen: ??");
//buffer.append(pParameter.length);
//buffer.append(Constants.NEWLINE);
- return buffer.toString() ;
+ return sb.toString() ;
}
}
--- a/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_MECHANISM_INFO.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_MECHANISM_INFO.java Wed Jul 05 19:46:31 2017 +0200
@@ -103,25 +103,25 @@
* @return the string representation of CK_MECHANISM_INFO
*/
public String toString() {
- StringBuffer buffer = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
- buffer.append(Constants.INDENT);
- buffer.append("ulMinKeySize: ");
- buffer.append(String.valueOf(ulMinKeySize));
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("ulMinKeySize: ");
+ sb.append(String.valueOf(ulMinKeySize));
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("ulMaxKeySize: ");
- buffer.append(String.valueOf(ulMaxKeySize));
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("ulMaxKeySize: ");
+ sb.append(String.valueOf(ulMaxKeySize));
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("flags: ");
- buffer.append(String.valueOf(flags));
- buffer.append(" = ");
- buffer.append(Functions.mechanismInfoFlagsToString(flags));
+ sb.append(Constants.INDENT);
+ sb.append("flags: ");
+ sb.append(String.valueOf(flags));
+ sb.append(" = ");
+ sb.append(Functions.mechanismInfoFlagsToString(flags));
//buffer.append(Constants.NEWLINE);
- return buffer.toString() ;
+ return sb.toString() ;
}
}
--- a/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_PBE_PARAMS.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_PBE_PARAMS.java Wed Jul 05 19:46:31 2017 +0200
@@ -109,39 +109,39 @@
* @return the string representation of CK_PBE_PARAMS
*/
public String toString() {
- StringBuffer buffer = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
- buffer.append(Constants.INDENT);
- buffer.append("pInitVector: ");
- buffer.append(pInitVector);
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("pInitVector: ");
+ sb.append(pInitVector);
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("ulPasswordLen: ");
- buffer.append(pPassword.length);
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("ulPasswordLen: ");
+ sb.append(pPassword.length);
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("pPassword: ");
- buffer.append(pPassword);
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("pPassword: ");
+ sb.append(pPassword);
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("ulSaltLen: ");
- buffer.append(pSalt.length);
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("ulSaltLen: ");
+ sb.append(pSalt.length);
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("pSalt: ");
- buffer.append(pSalt);
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("pSalt: ");
+ sb.append(pSalt);
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("ulIteration: ");
- buffer.append(ulIteration);
+ sb.append(Constants.INDENT);
+ sb.append("ulIteration: ");
+ sb.append(ulIteration);
//buffer.append(Constants.NEWLINE);
- return buffer.toString();
+ return sb.toString();
}
}
--- a/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_PKCS5_PBKD2_PARAMS.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_PKCS5_PBKD2_PARAMS.java Wed Jul 05 19:46:31 2017 +0200
@@ -118,44 +118,44 @@
* @return the string representation of CK_PKCS5_PBKD2_PARAMS
*/
public String toString() {
- StringBuffer buffer = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
- buffer.append(Constants.INDENT);
- buffer.append("saltSource: ");
- buffer.append(saltSource);
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("saltSource: ");
+ sb.append(saltSource);
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("pSaltSourceData: ");
- buffer.append(Functions.toHexString(pSaltSourceData));
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("pSaltSourceData: ");
+ sb.append(Functions.toHexString(pSaltSourceData));
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("ulSaltSourceDataLen: ");
- buffer.append(pSaltSourceData.length);
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("ulSaltSourceDataLen: ");
+ sb.append(pSaltSourceData.length);
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("iterations: ");
- buffer.append(iterations);
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("iterations: ");
+ sb.append(iterations);
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("prf: ");
- buffer.append(prf);
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("prf: ");
+ sb.append(prf);
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("pPrfData: ");
- buffer.append(Functions.toHexString(pPrfData));
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("pPrfData: ");
+ sb.append(Functions.toHexString(pPrfData));
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("ulPrfDataLen: ");
- buffer.append(pPrfData.length);
+ sb.append(Constants.INDENT);
+ sb.append("ulPrfDataLen: ");
+ sb.append(pPrfData.length);
//buffer.append(Constants.NEWLINE);
- return buffer.toString();
+ return sb.toString();
}
}
--- a/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_RSA_PKCS_OAEP_PARAMS.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_RSA_PKCS_OAEP_PARAMS.java Wed Jul 05 19:46:31 2017 +0200
@@ -110,34 +110,34 @@
* @return the string representation of CK_RSA_PKCS_OAEP_PARAMS
*/
public String toString() {
- StringBuffer buffer = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
- buffer.append(Constants.INDENT);
- buffer.append("hashAlg: ");
- buffer.append(hashAlg);
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("hashAlg: ");
+ sb.append(hashAlg);
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("mgf: ");
- buffer.append(mgf);
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("mgf: ");
+ sb.append(mgf);
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("source: ");
- buffer.append(source);
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("source: ");
+ sb.append(source);
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("pSourceData: ");
- buffer.append(pSourceData.toString());
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("pSourceData: ");
+ sb.append(pSourceData.toString());
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("pSourceDataLen: ");
- buffer.append(Functions.toHexString(pSourceData));
+ sb.append(Constants.INDENT);
+ sb.append("pSourceDataLen: ");
+ sb.append(Functions.toHexString(pSourceData));
//buffer.append(Constants.NEWLINE);
- return buffer.toString() ;
+ return sb.toString() ;
}
}
--- a/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_RSA_PKCS_PSS_PARAMS.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_RSA_PKCS_PSS_PARAMS.java Wed Jul 05 19:46:31 2017 +0200
@@ -95,24 +95,24 @@
* @return the string representation of CK_PKCS5_PBKD2_PARAMS
*/
public String toString() {
- StringBuffer buffer = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
- buffer.append(Constants.INDENT);
- buffer.append("hashAlg: 0x");
- buffer.append(Functions.toFullHexString(hashAlg));
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("hashAlg: 0x");
+ sb.append(Functions.toFullHexString(hashAlg));
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("mgf: 0x");
- buffer.append(Functions.toFullHexString(mgf));
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("mgf: 0x");
+ sb.append(Functions.toFullHexString(mgf));
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("sLen: ");
- buffer.append(sLen);
+ sb.append(Constants.INDENT);
+ sb.append("sLen: ");
+ sb.append(sLen);
//buffer.append(Constants.NEWLINE);
- return buffer.toString();
+ return sb.toString();
}
}
--- a/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_SESSION_INFO.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_SESSION_INFO.java Wed Jul 05 19:46:31 2017 +0200
@@ -114,29 +114,29 @@
* @return the string representation of CK_SESSION_INFO
*/
public String toString() {
- StringBuffer buffer = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
- buffer.append(Constants.INDENT);
- buffer.append("slotID: ");
- buffer.append(String.valueOf(slotID));
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("slotID: ");
+ sb.append(String.valueOf(slotID));
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("state: ");
- buffer.append(Functions.sessionStateToString(state));
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("state: ");
+ sb.append(Functions.sessionStateToString(state));
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("flags: ");
- buffer.append(Functions.sessionInfoFlagsToString(flags));
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("flags: ");
+ sb.append(Functions.sessionInfoFlagsToString(flags));
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("ulDeviceError: ");
- buffer.append(Functions.toHexString(ulDeviceError));
+ sb.append(Constants.INDENT);
+ sb.append("ulDeviceError: ");
+ sb.append(Functions.toHexString(ulDeviceError));
//buffer.append(Constants.NEWLINE);
- return buffer.toString() ;
+ return sb.toString() ;
}
}
--- a/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_SLOT_INFO.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_SLOT_INFO.java Wed Jul 05 19:46:31 2017 +0200
@@ -130,34 +130,34 @@
* @return the string representation of CK_SLOT_INFO
*/
public String toString() {
- StringBuffer buffer = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
- buffer.append(Constants.INDENT);
- buffer.append("slotDescription: ");
- buffer.append(new String(slotDescription));
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("slotDescription: ");
+ sb.append(new String(slotDescription));
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("manufacturerID: ");
- buffer.append(new String(manufacturerID));
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("manufacturerID: ");
+ sb.append(new String(manufacturerID));
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("flags: ");
- buffer.append(Functions.slotInfoFlagsToString(flags));
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("flags: ");
+ sb.append(Functions.slotInfoFlagsToString(flags));
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("hardwareVersion: ");
- buffer.append(hardwareVersion.toString());
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("hardwareVersion: ");
+ sb.append(hardwareVersion.toString());
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("firmwareVersion: ");
- buffer.append(firmwareVersion.toString());
+ sb.append(Constants.INDENT);
+ sb.append("firmwareVersion: ");
+ sb.append(firmwareVersion.toString());
//buffer.append(Constants.NEWLINE);
- return buffer.toString() ;
+ return sb.toString() ;
}
}
--- a/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_TOKEN_INFO.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_TOKEN_INFO.java Wed Jul 05 19:46:31 2017 +0200
@@ -271,119 +271,119 @@
* @return the string representation of CK_TOKEN_INFO
*/
public String toString() {
- StringBuffer buffer = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
- buffer.append(Constants.INDENT);
- buffer.append("label: ");
- buffer.append(new String(label));
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("label: ");
+ sb.append(new String(label));
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("manufacturerID: ");
- buffer.append(new String(manufacturerID));
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("manufacturerID: ");
+ sb.append(new String(manufacturerID));
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("model: ");
- buffer.append(new String(model));
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("model: ");
+ sb.append(new String(model));
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("serialNumber: ");
- buffer.append(new String(serialNumber));
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("serialNumber: ");
+ sb.append(new String(serialNumber));
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("flags: ");
- buffer.append(Functions.tokenInfoFlagsToString(flags));
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("flags: ");
+ sb.append(Functions.tokenInfoFlagsToString(flags));
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("ulMaxSessionCount: ");
- buffer.append((ulMaxSessionCount == PKCS11Constants.CK_EFFECTIVELY_INFINITE)
+ sb.append(Constants.INDENT);
+ sb.append("ulMaxSessionCount: ");
+ sb.append((ulMaxSessionCount == PKCS11Constants.CK_EFFECTIVELY_INFINITE)
? "CK_EFFECTIVELY_INFINITE"
: (ulMaxSessionCount == PKCS11Constants.CK_UNAVAILABLE_INFORMATION)
? "CK_UNAVAILABLE_INFORMATION"
: String.valueOf(ulMaxSessionCount));
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("ulSessionCount: ");
- buffer.append((ulSessionCount == PKCS11Constants.CK_UNAVAILABLE_INFORMATION)
+ sb.append(Constants.INDENT);
+ sb.append("ulSessionCount: ");
+ sb.append((ulSessionCount == PKCS11Constants.CK_UNAVAILABLE_INFORMATION)
? "CK_UNAVAILABLE_INFORMATION"
: String.valueOf(ulSessionCount));
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("ulMaxRwSessionCount: ");
- buffer.append((ulMaxRwSessionCount == PKCS11Constants.CK_EFFECTIVELY_INFINITE)
+ sb.append(Constants.INDENT);
+ sb.append("ulMaxRwSessionCount: ");
+ sb.append((ulMaxRwSessionCount == PKCS11Constants.CK_EFFECTIVELY_INFINITE)
? "CK_EFFECTIVELY_INFINITE"
: (ulMaxRwSessionCount == PKCS11Constants.CK_UNAVAILABLE_INFORMATION)
? "CK_UNAVAILABLE_INFORMATION"
: String.valueOf(ulMaxRwSessionCount));
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("ulRwSessionCount: ");
- buffer.append((ulRwSessionCount == PKCS11Constants.CK_UNAVAILABLE_INFORMATION)
+ sb.append(Constants.INDENT);
+ sb.append("ulRwSessionCount: ");
+ sb.append((ulRwSessionCount == PKCS11Constants.CK_UNAVAILABLE_INFORMATION)
? "CK_UNAVAILABLE_INFORMATION"
: String.valueOf(ulRwSessionCount));
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("ulMaxPinLen: ");
- buffer.append(String.valueOf(ulMaxPinLen));
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("ulMaxPinLen: ");
+ sb.append(String.valueOf(ulMaxPinLen));
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("ulMinPinLen: ");
- buffer.append(String.valueOf(ulMinPinLen));
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("ulMinPinLen: ");
+ sb.append(String.valueOf(ulMinPinLen));
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("ulTotalPublicMemory: ");
- buffer.append((ulTotalPublicMemory == PKCS11Constants.CK_UNAVAILABLE_INFORMATION)
+ sb.append(Constants.INDENT);
+ sb.append("ulTotalPublicMemory: ");
+ sb.append((ulTotalPublicMemory == PKCS11Constants.CK_UNAVAILABLE_INFORMATION)
? "CK_UNAVAILABLE_INFORMATION"
: String.valueOf(ulTotalPublicMemory));
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("ulFreePublicMemory: ");
- buffer.append((ulFreePublicMemory == PKCS11Constants.CK_UNAVAILABLE_INFORMATION)
+ sb.append(Constants.INDENT);
+ sb.append("ulFreePublicMemory: ");
+ sb.append((ulFreePublicMemory == PKCS11Constants.CK_UNAVAILABLE_INFORMATION)
? "CK_UNAVAILABLE_INFORMATION"
: String.valueOf(ulFreePublicMemory));
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("ulTotalPrivateMemory: ");
- buffer.append((ulTotalPrivateMemory == PKCS11Constants.CK_UNAVAILABLE_INFORMATION)
+ sb.append(Constants.INDENT);
+ sb.append("ulTotalPrivateMemory: ");
+ sb.append((ulTotalPrivateMemory == PKCS11Constants.CK_UNAVAILABLE_INFORMATION)
? "CK_UNAVAILABLE_INFORMATION"
: String.valueOf(ulTotalPrivateMemory));
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("ulFreePrivateMemory: ");
- buffer.append((ulFreePrivateMemory == PKCS11Constants.CK_UNAVAILABLE_INFORMATION)
+ sb.append(Constants.INDENT);
+ sb.append("ulFreePrivateMemory: ");
+ sb.append((ulFreePrivateMemory == PKCS11Constants.CK_UNAVAILABLE_INFORMATION)
? "CK_UNAVAILABLE_INFORMATION"
: String.valueOf(ulFreePrivateMemory));
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("hardwareVersion: ");
- buffer.append(hardwareVersion.toString());
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("hardwareVersion: ");
+ sb.append(hardwareVersion.toString());
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("firmwareVersion: ");
- buffer.append(firmwareVersion.toString());
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("firmwareVersion: ");
+ sb.append(firmwareVersion.toString());
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("utcTime: ");
- buffer.append(new String(utcTime));
+ sb.append(Constants.INDENT);
+ sb.append("utcTime: ");
+ sb.append(new String(utcTime));
//buffer.append(Constants.NEWLINE);
- return buffer.toString() ;
+ return sb.toString() ;
}
}
--- a/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_X9_42_DH1_DERIVE_PARAMS.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_X9_42_DH1_DERIVE_PARAMS.java Wed Jul 05 19:46:31 2017 +0200
@@ -99,34 +99,34 @@
* @return the string representation of CK_PKCS5_PBKD2_PARAMS
*/
public String toString() {
- StringBuffer buffer = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
- buffer.append(Constants.INDENT);
- buffer.append("kdf: 0x");
- buffer.append(Functions.toFullHexString(kdf));
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("kdf: 0x");
+ sb.append(Functions.toFullHexString(kdf));
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("pOtherInfoLen: ");
- buffer.append(pOtherInfo.length);
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("pOtherInfoLen: ");
+ sb.append(pOtherInfo.length);
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("pOtherInfo: ");
- buffer.append(Functions.toHexString(pOtherInfo));
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("pOtherInfo: ");
+ sb.append(Functions.toHexString(pOtherInfo));
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("pPublicDataLen: ");
- buffer.append(pPublicData.length);
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("pPublicDataLen: ");
+ sb.append(pPublicData.length);
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("pPublicData: ");
- buffer.append(Functions.toHexString(pPublicData));
+ sb.append(Constants.INDENT);
+ sb.append("pPublicData: ");
+ sb.append(Functions.toHexString(pPublicData));
//buffer.append(Constants.NEWLINE);
- return buffer.toString();
+ return sb.toString();
}
}
--- a/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_X9_42_DH2_DERIVE_PARAMS.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_X9_42_DH2_DERIVE_PARAMS.java Wed Jul 05 19:46:31 2017 +0200
@@ -128,54 +128,54 @@
* @return the string representation of CK_PKCS5_PBKD2_PARAMS
*/
public String toString() {
- StringBuffer buffer = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
- buffer.append(Constants.INDENT);
- buffer.append("kdf: 0x");
- buffer.append(Functions.toFullHexString(kdf));
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("kdf: 0x");
+ sb.append(Functions.toFullHexString(kdf));
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("pOtherInfoLen: ");
- buffer.append(pOtherInfo.length);
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("pOtherInfoLen: ");
+ sb.append(pOtherInfo.length);
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("pOtherInfo: ");
- buffer.append(Functions.toHexString(pOtherInfo));
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("pOtherInfo: ");
+ sb.append(Functions.toHexString(pOtherInfo));
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("pPublicDataLen: ");
- buffer.append(pPublicData.length);
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("pPublicDataLen: ");
+ sb.append(pPublicData.length);
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("pPublicData: ");
- buffer.append(Functions.toHexString(pPublicData));
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("pPublicData: ");
+ sb.append(Functions.toHexString(pPublicData));
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("ulPrivateDataLen: ");
- buffer.append(ulPrivateDataLen);
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("ulPrivateDataLen: ");
+ sb.append(ulPrivateDataLen);
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("hPrivateData: ");
- buffer.append(hPrivateData);
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("hPrivateData: ");
+ sb.append(hPrivateData);
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("pPublicDataLen2: ");
- buffer.append(pPublicData2.length);
- buffer.append(Constants.NEWLINE);
+ sb.append(Constants.INDENT);
+ sb.append("pPublicDataLen2: ");
+ sb.append(pPublicData2.length);
+ sb.append(Constants.NEWLINE);
- buffer.append(Constants.INDENT);
- buffer.append("pPublicData2: ");
- buffer.append(Functions.toHexString(pPublicData2));
+ sb.append(Constants.INDENT);
+ sb.append("pPublicData2: ");
+ sb.append(Functions.toHexString(pPublicData2));
//buffer.append(Constants.NEWLINE);
- return buffer.toString();
+ return sb.toString();
}
}
--- a/jdk/src/share/classes/sun/security/pkcs11/wrapper/Functions.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/pkcs11/wrapper/Functions.java Wed Jul 05 19:46:31 2017 +0200
@@ -109,14 +109,14 @@
*/
public static String toFullHexString(long value) {
long currentValue = value;
- StringBuffer stringBuffer = new StringBuffer(16);
+ StringBuilder sb = new StringBuilder(16);
for(int j = 0; j < 16; j++) {
int currentDigit = (int) currentValue & 0xf;
- stringBuffer.append(HEX_DIGITS[currentDigit]);
+ sb.append(HEX_DIGITS[currentDigit]);
currentValue >>>= 4;
}
- return stringBuffer.reverse().toString();
+ return sb.reverse().toString();
}
/**
@@ -128,14 +128,14 @@
*/
public static String toFullHexString(int value) {
int currentValue = value;
- StringBuffer stringBuffer = new StringBuffer(8);
+ StringBuilder sb = new StringBuilder(8);
for(int i = 0; i < 8; i++) {
int currentDigit = currentValue & 0xf;
- stringBuffer.append(HEX_DIGITS[currentDigit]);
+ sb.append(HEX_DIGITS[currentDigit]);
currentValue >>>= 4;
}
- return stringBuffer.reverse().toString();
+ return sb.reverse().toString();
}
/**
@@ -161,20 +161,20 @@
return null;
}
- StringBuffer buffer = new StringBuffer(2 * value.length);
+ StringBuilder sb = new StringBuilder(2 * value.length);
int single;
for (int i = 0; i < value.length; i++) {
single = value[i] & 0xFF;
if (single < 0x10) {
- buffer.append('0');
+ sb.append('0');
}
- buffer.append(Integer.toString(single, 16));
+ sb.append(Integer.toString(single, 16));
}
- return buffer.toString();
+ return sb.toString();
}
/**
--- a/jdk/src/share/classes/sun/security/provider/AuthPolicyFile.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/provider/AuthPolicyFile.java Wed Jul 05 19:46:31 2017 +0200
@@ -944,7 +944,7 @@
}
File f = new File(path);
path = f.getCanonicalPath();
- StringBuffer sb = new StringBuffer(path);
+ StringBuilder sb = new StringBuilder(path);
// reappend '*' to canonicalized filename (note that
// canonicalization may have removed trailing file
// separator, so we have to check for that, too)
@@ -1095,7 +1095,7 @@
@Override
public String toString(){
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
sb.append(rb.getString("LPARAM"));
sb.append(getCodeSource());
sb.append("\n");
--- a/jdk/src/share/classes/sun/security/provider/X509Factory.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/provider/X509Factory.java Wed Jul 05 19:46:31 2017 +0200
@@ -519,7 +519,7 @@
// Step 2: Read the rest of header, determine the line end
int end;
- StringBuffer header = new StringBuffer("-----");
+ StringBuilder header = new StringBuilder("-----");
while (true) {
int next = is.read();
if (next == -1) {
@@ -562,7 +562,7 @@
}
// Step 4: Consume the footer
- StringBuffer footer = new StringBuffer("-");
+ StringBuilder footer = new StringBuilder("-");
while (true) {
int next = is.read();
// Add next == '\n' for maximum safety, in case endline
--- a/jdk/src/share/classes/sun/security/smartcardio/PCSC.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/smartcardio/PCSC.java Wed Jul 05 19:46:31 2017 +0200
@@ -172,7 +172,7 @@
private final static char[] hexDigits = "0123456789abcdef".toCharArray();
public static String toString(byte[] b) {
- StringBuffer sb = new StringBuffer(b.length * 3);
+ StringBuilder sb = new StringBuilder(b.length * 3);
for (int i = 0; i < b.length; i++) {
int k = b[i] & 0xff;
if (i != 0) {
--- a/jdk/src/share/classes/sun/security/ssl/HandshakeMessage.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/ssl/HandshakeMessage.java Wed Jul 05 19:46:31 2017 +0200
@@ -1474,17 +1474,17 @@
s.println();
if (protocolVersion.v >= ProtocolVersion.TLS12.v) {
- StringBuffer buffer = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
boolean opened = false;
for (SignatureAndHashAlgorithm signAlg : algorithms) {
if (opened) {
- buffer.append(", " + signAlg.getAlgorithmName());
+ sb.append(", " + signAlg.getAlgorithmName());
} else {
- buffer.append(signAlg.getAlgorithmName());
+ sb.append(signAlg.getAlgorithmName());
opened = true;
}
}
- s.println("Supported Signature Algorithms: " + buffer);
+ s.println("Supported Signature Algorithms: " + sb);
}
s.println("Cert Authorities:");
--- a/jdk/src/share/classes/sun/security/ssl/SSLSocketImpl.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/ssl/SSLSocketImpl.java Wed Jul 05 19:46:31 2017 +0200
@@ -2594,7 +2594,7 @@
*/
@Override
public String toString() {
- StringBuffer retval = new StringBuffer(80);
+ StringBuilder retval = new StringBuilder(80);
retval.append(Integer.toHexString(hashCode()));
retval.append("[");
--- a/jdk/src/share/classes/sun/security/ssl/ServerNameExtension.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/ssl/ServerNameExtension.java Wed Jul 05 19:46:31 2017 +0200
@@ -266,12 +266,12 @@
@Override
public String toString() {
- StringBuffer buffer = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
for (SNIServerName sniName : sniMap.values()) {
- buffer.append("[" + sniName + "]");
+ sb.append("[" + sniName + "]");
}
- return "Extension " + type + ", server_name: " + buffer;
+ return "Extension " + type + ", server_name: " + sb;
}
private static class UnknownServerName extends SNIServerName {
--- a/jdk/src/share/classes/sun/security/ssl/SessionId.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/ssl/SessionId.java Wed Jul 05 19:46:31 2017 +0200
@@ -72,16 +72,16 @@
public String toString ()
{
int len = sessionId.length;
- StringBuffer s = new StringBuffer (10 + 2 * len);
+ StringBuilder sb = new StringBuilder (10 + 2 * len);
- s.append ("{");
+ sb.append("{");
for (int i = 0; i < len; i++) {
- s.append (0x0ff & sessionId [i]);
+ sb.append(0x0ff & sessionId[i]);
if (i != (len - 1))
- s.append (", ");
+ sb.append (", ");
}
- s.append ("}");
- return s.toString ();
+ sb.append("}");
+ return sb.toString ();
}
--- a/jdk/src/share/classes/sun/security/ssl/SignatureAlgorithmsExtension.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/ssl/SignatureAlgorithmsExtension.java Wed Jul 05 19:46:31 2017 +0200
@@ -118,18 +118,18 @@
@Override
public String toString() {
- StringBuffer buffer = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
boolean opened = false;
for (SignatureAndHashAlgorithm signAlg : algorithms) {
if (opened) {
- buffer.append(", " + signAlg.getAlgorithmName());
+ sb.append(", " + signAlg.getAlgorithmName());
} else {
- buffer.append(signAlg.getAlgorithmName());
+ sb.append(signAlg.getAlgorithmName());
opened = true;
}
}
- return "Extension " + type + ", signature_algorithms: " + buffer;
+ return "Extension " + type + ", signature_algorithms: " + sb;
}
}
--- a/jdk/src/share/classes/sun/security/tools/jarsigner/Main.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/tools/jarsigner/Main.java Wed Jul 05 19:46:31 2017 +0200
@@ -728,7 +728,7 @@
output.put(label, new ArrayList<String>());
}
- StringBuffer fb = new StringBuffer();
+ StringBuilder fb = new StringBuilder();
String s = Long.toString(je.getSize());
for (int i = 6 - s.length(); i > 0; --i) {
fb.append(' ');
@@ -1572,25 +1572,25 @@
if (cacheForSignerInfo.containsKey(signer)) {
return cacheForSignerInfo.get(signer);
}
- StringBuffer s = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
List<? extends Certificate> certs = signer.getSignerCertPath().getCertificates();
// display the signature timestamp, if present
Date timestamp;
Timestamp ts = signer.getTimestamp();
if (ts != null) {
- s.append(printTimestamp(tab, ts));
- s.append('\n');
+ sb.append(printTimestamp(tab, ts));
+ sb.append('\n');
timestamp = ts.getTimestamp();
} else {
timestamp = null;
noTimestamp = true;
}
- // display the certificate(s). The first one is end-entity cert and
+ // display the certificate(sb). The first one is end-entity cert and
// its KeyUsage should be checked.
boolean first = true;
for (Certificate c : certs) {
- s.append(printCert(tab, c, true, timestamp, first));
- s.append('\n');
+ sb.append(printCert(tab, c, true, timestamp, first));
+ sb.append('\n');
first = false;
}
try {
@@ -1605,11 +1605,11 @@
// No more warning, we alreay have hasExpiredCert or notYetValidCert
} else {
chainNotValidated = true;
- s.append(tab + rb.getString(".CertPath.not.validated.") +
+ sb.append(tab + rb.getString(".CertPath.not.validated.") +
e.getLocalizedMessage() + "]\n"); // TODO
}
}
- String result = s.toString();
+ String result = sb.toString();
cacheForSignerInfo.put(signer, result);
return result;
}
--- a/jdk/src/share/classes/sun/security/tools/keytool/Main.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/tools/keytool/Main.java Wed Jul 05 19:46:31 2017 +0200
@@ -3664,7 +3664,7 @@
.startsWith(s.toLowerCase(Locale.ENGLISH))) {
match[nmatch++] = i;
} else {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
boolean first = true;
for (char c: one.toCharArray()) {
if (first) {
@@ -3690,7 +3690,7 @@
if (match[1] > experiment) {
return match[0];
}
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
MessageFormat form = new MessageFormat(rb.getString
("command.{0}.is.ambiguous."));
Object[] source = {s};
--- a/jdk/src/share/classes/sun/security/tools/policytool/PolicyTool.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/tools/policytool/PolicyTool.java Wed Jul 05 19:46:31 2017 +0200
@@ -975,16 +975,16 @@
String result = "";
if ((grantEntry.principals != null) &&
(!grantEntry.principals.isEmpty())) {
- StringBuffer buffer = new StringBuffer(200);
+ StringBuilder sb = new StringBuilder(200);
ListIterator<PolicyParser.PrincipalEntry> list =
grantEntry.principals.listIterator();
while (list.hasNext()) {
PolicyParser.PrincipalEntry pppe = list.next();
- buffer.append(" Principal " + pppe.getDisplayClass() + " " +
+ sb.append(" Principal " + pppe.getDisplayClass() + " " +
pppe.getDisplayName(true));
- if (list.hasNext()) buffer.append(", ");
+ if (list.hasNext()) sb.append(", ");
}
- result = buffer.toString();
+ result = sb.toString();
}
return result;
}
--- a/jdk/src/share/classes/sun/security/util/Debug.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/util/Debug.java Wed Jul 05 19:46:31 2017 +0200
@@ -188,13 +188,13 @@
*/
public static String toHexString(BigInteger b) {
String hexValue = b.toString(16);
- StringBuffer buf = new StringBuffer(hexValue.length()*2);
+ StringBuilder sb = new StringBuilder(hexValue.length()*2);
if (hexValue.startsWith("-")) {
- buf.append(" -");
+ sb.append(" -");
hexValue = hexValue.substring(1);
} else {
- buf.append(" "); // four spaces
+ sb.append(" "); // four spaces
}
if ((hexValue.length()%2) != 0) {
// add back the leading 0
@@ -203,17 +203,17 @@
int i=0;
while (i < hexValue.length()) {
// one byte at a time
- buf.append(hexValue.substring(i, i+2));
+ sb.append(hexValue.substring(i, i + 2));
i+=2;
if (i!= hexValue.length()) {
if ((i%64) == 0) {
- buf.append("\n "); // line after eight words
+ sb.append("\n "); // line after eight words
} else if (i%8 == 0) {
- buf.append(" "); // space between words
+ sb.append(" "); // space between words
}
}
}
- return buf.toString();
+ return sb.toString();
}
/**
@@ -221,7 +221,7 @@
*/
private static String marshal(String args) {
if (args != null) {
- StringBuffer target = new StringBuffer();
+ StringBuilder target = new StringBuilder();
StringBuffer source = new StringBuffer(args);
// obtain the "permission=<classname>" options
--- a/jdk/src/share/classes/sun/security/util/ManifestEntryVerifier.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/util/ManifestEntryVerifier.java Wed Jul 05 19:46:31 2017 +0200
@@ -238,7 +238,7 @@
static String toHex(byte[] data) {
- StringBuffer sb = new StringBuffer(data.length*2);
+ StringBuilder sb = new StringBuilder(data.length*2);
for (int i=0; i<data.length; i++) {
sb.append(hexc[(data[i] >>4) & 0x0f]);
--- a/jdk/src/share/classes/sun/security/util/ObjectIdentifier.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/util/ObjectIdentifier.java Wed Jul 05 19:46:31 2017 +0200
@@ -418,7 +418,7 @@
String s = stringForm;
if (s == null) {
int length = encoding.length;
- StringBuffer sb = new StringBuffer(length * 4);
+ StringBuilder sb = new StringBuilder(length * 4);
int fromPos = 0;
for (int i = 0; i < length; i++) {
--- a/jdk/src/share/classes/sun/security/util/PropertyExpander.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/util/PropertyExpander.java Wed Jul 05 19:46:31 2017 +0200
@@ -67,7 +67,7 @@
// no special characters
if (p == -1) return value;
- StringBuffer sb = new StringBuffer(value.length());
+ StringBuilder sb = new StringBuilder(value.length());
int max = value.length();
int i = 0; // index of last character we copied
--- a/jdk/src/share/classes/sun/security/util/SignatureFileVerifier.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/util/SignatureFileVerifier.java Wed Jul 05 19:46:31 2017 +0200
@@ -552,7 +552,7 @@
static String toHex(byte[] data) {
- StringBuffer sb = new StringBuffer(data.length*2);
+ StringBuilder sb = new StringBuilder(data.length*2);
for (int i=0; i<data.length; i++) {
sb.append(hexc[(data[i] >>4) & 0x0f]);
--- a/jdk/src/share/classes/sun/security/x509/X509CRLImpl.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/security/x509/X509CRLImpl.java Wed Jul 05 19:46:31 2017 +0200
@@ -536,7 +536,7 @@
* @return value of this CRL in a printable form.
*/
public String toString() {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
sb.append("X.509 CRL v" + (version+1) + "\n");
if (sigAlgId != null)
sb.append("Signature Algorithm: " + sigAlgId.toString() +
--- a/jdk/src/share/classes/sun/swing/SwingUtilities2.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/swing/SwingUtilities2.java Wed Jul 05 19:46:31 2017 +0200
@@ -1431,7 +1431,7 @@
}
public static String displayPropertiesToCSS(Font font, Color fg) {
- StringBuffer rule = new StringBuffer("body {");
+ StringBuilder rule = new StringBuilder("body {");
if (font != null) {
rule.append(" font-family: ");
rule.append(font.getFamily());
--- a/jdk/src/share/classes/sun/swing/plaf/synth/DefaultSynthStyle.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/swing/plaf/synth/DefaultSynthStyle.java Wed Jul 05 19:46:31 2017 +0200
@@ -673,33 +673,33 @@
public String toString() {
- StringBuffer buf = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
- buf.append(super.toString()).append(',');
+ sb.append(super.toString()).append(',');
- buf.append("data=").append(data).append(',');
+ sb.append("data=").append(data).append(',');
- buf.append("font=").append(font).append(',');
+ sb.append("font=").append(font).append(',');
- buf.append("insets=").append(insets).append(',');
+ sb.append("insets=").append(insets).append(',');
- buf.append("synthGraphics=").append(synthGraphics).append(',');
+ sb.append("synthGraphics=").append(synthGraphics).append(',');
- buf.append("painter=").append(painter).append(',');
+ sb.append("painter=").append(painter).append(',');
StateInfo[] states = getStateInfo();
if (states != null) {
- buf.append("states[");
+ sb.append("states[");
for (StateInfo state : states) {
- buf.append(state.toString()).append(',');
+ sb.append(state.toString()).append(',');
}
- buf.append(']').append(',');
+ sb.append(']').append(',');
}
// remove last newline
- buf.deleteCharAt(buf.length() - 1);
+ sb.deleteCharAt(sb.length() - 1);
- return buf.toString();
+ return sb.toString();
}
@@ -909,19 +909,19 @@
}
public String toString() {
- StringBuffer buf = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
- buf.append(super.toString()).append(',');
+ sb.append(super.toString()).append(',');
- buf.append("state=").append(Integer.toString(state)).append(',');
+ sb.append("state=").append(Integer.toString(state)).append(',');
- buf.append("font=").append(font).append(',');
+ sb.append("font=").append(font).append(',');
if (colors != null) {
- buf.append("colors=").append(Arrays.asList(colors)).
+ sb.append("colors=").append(Arrays.asList(colors)).
append(',');
}
- return buf.toString();
+ return sb.toString();
}
}
}
--- a/jdk/src/share/classes/sun/swing/plaf/synth/SynthFileChooserUIImpl.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/swing/plaf/synth/SynthFileChooserUIImpl.java Wed Jul 05 19:46:31 2017 +0200
@@ -439,20 +439,20 @@
}
private String fileNameString(File[] files) {
- StringBuffer buf = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
for (int i = 0; files != null && i < files.length; i++) {
if (i > 0) {
- buf.append(" ");
+ sb.append(" ");
}
if (files.length > 1) {
- buf.append("\"");
+ sb.append("\"");
}
- buf.append(fileNameString(files[i]));
+ sb.append(fileNameString(files[i]));
if (files.length > 1) {
- buf.append("\"");
+ sb.append("\"");
}
}
- return buf.toString();
+ return sb.toString();
}
public void uninstallUI(JComponent c) {
--- a/jdk/src/share/classes/sun/text/normalizer/UTF16.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/text/normalizer/UTF16.java Wed Jul 05 19:46:31 2017 +0200
@@ -530,7 +530,7 @@
return String.valueOf((char)ch);
}
- StringBuffer result = new StringBuffer();
+ StringBuilder result = new StringBuilder();
result.append(getLeadSurrogate(ch));
result.append(getTrailSurrogate(ch));
return result.toString();
--- a/jdk/src/share/classes/sun/tools/java/MemberDefinition.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/tools/java/MemberDefinition.java Wed Jul 05 19:46:31 2017 +0200
@@ -919,18 +919,18 @@
if (isInitializer()) {
return isStatic() ? "static {}" : "instance {}";
} else if (isConstructor()) {
- StringBuffer buf = new StringBuffer();
- buf.append(name);
- buf.append('(');
+ StringBuilder sb = new StringBuilder();
+ sb.append(name);
+ sb.append('(');
Type argTypes[] = getType().getArgumentTypes();
for (int i = 0 ; i < argTypes.length ; i++) {
if (i > 0) {
- buf.append(',');
+ sb.append(',');
}
- buf.append(argTypes[i].toString());
+ sb.append(argTypes[i].toString());
}
- buf.append(')');
- return buf.toString();
+ sb.append(')');
+ return sb.toString();
} else if (isInnerClass()) {
return getInnerClass().toString();
}
--- a/jdk/src/share/classes/sun/tools/java/MethodSet.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/tools/java/MethodSet.java Wed Jul 05 19:46:31 2017 +0200
@@ -261,18 +261,18 @@
*/
public String toString() {
int len = size();
- StringBuffer buf = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
Iterator all = iterator();
- buf.append("{");
+ sb.append("{");
while (all.hasNext()) {
- buf.append(all.next().toString());
+ sb.append(all.next().toString());
len--;
if (len > 0) {
- buf.append(", ");
+ sb.append(", ");
}
}
- buf.append("}");
- return buf.toString();
+ sb.append("}");
+ return sb.toString();
}
}
--- a/jdk/src/share/classes/sun/tools/java/MethodType.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/tools/java/MethodType.java Wed Jul 05 19:46:31 2017 +0200
@@ -91,17 +91,17 @@
}
public String typeString(String id, boolean abbrev, boolean ret) {
- StringBuffer buf = new StringBuffer();
- buf.append(id);
- buf.append('(');
+ StringBuilder sb = new StringBuilder();
+ sb.append(id);
+ sb.append('(');
for (int i = 0 ; i < argTypes.length ; i++) {
if (i > 0) {
- buf.append(", ");
+ sb.append(", ");
}
- buf.append(argTypes[i].typeString("", abbrev, ret));
+ sb.append(argTypes[i].typeString("", abbrev, ret));
}
- buf.append(')');
+ sb.append(')');
- return ret ? getReturnType().typeString(buf.toString(), abbrev, ret) : buf.toString();
+ return ret ? getReturnType().typeString(sb.toString(), abbrev, ret) : sb.toString();
}
}
--- a/jdk/src/share/classes/sun/tools/java/Parser.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/tools/java/Parser.java Wed Jul 05 19:46:31 2017 +0200
@@ -1395,24 +1395,24 @@
return res;
}
- StringBuffer buf = new StringBuffer(res.id.toString());
+ StringBuilder sb = new StringBuilder(res.id.toString());
while (token == FIELD) {
scan();
if ((token == MUL) && star) {
scan();
- buf.append(".*");
+ sb.append(".*");
break;
}
- buf.append('.');
+ sb.append('.');
if (token == IDENT) {
- buf.append(scanner.idValue);
+ sb.append(scanner.idValue);
}
expect(IDENT);
}
- res.id = Identifier.lookup(buf.toString());
+ res.id = Identifier.lookup(sb.toString());
return res;
}
/**
--- a/jdk/src/share/classes/sun/tools/java/Type.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/tools/java/Type.java Wed Jul 05 19:46:31 2017 +0200
@@ -274,15 +274,15 @@
* Create a method type with arguments.
*/
public static synchronized Type tMethod(Type returnType, Type argTypes[]) {
- StringBuffer buf = new StringBuffer();
- buf.append(SIG_METHOD);
+ StringBuilder sb = new StringBuilder();
+ sb.append(SIG_METHOD);
for (int i = 0 ; i < argTypes.length ; i++) {
- buf.append(argTypes[i].getTypeSignature());
+ sb.append(argTypes[i].getTypeSignature());
}
- buf.append(SIG_ENDMETHOD);
- buf.append(returnType.getTypeSignature());
+ sb.append(SIG_ENDMETHOD);
+ sb.append(returnType.getTypeSignature());
- String sig = buf.toString();
+ String sig = sb.toString();
Type t = (Type)typeHash.get(sig);
if (t == null) {
t = new MethodType(sig, returnType, argTypes);
--- a/jdk/src/share/classes/sun/tools/jconsole/Formatter.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/tools/jconsole/Formatter.java Wed Jul 05 19:46:31 2017 +0200
@@ -232,15 +232,15 @@
}
static String justify(String str, int size) {
- StringBuffer buf = new StringBuffer();
- buf.append("<TT>");
+ StringBuilder sb = new StringBuilder();
+ sb.append("<TT>");
int n = size - str.length();
for (int i = 0; i < n; i++) {
- buf.append(" ");
+ sb.append(" ");
}
- buf.append(str);
- buf.append("</TT>");
- return buf.toString();
+ sb.append(str);
+ sb.append("</TT>");
+ return sb.toString();
}
static String newRow(String label, String value) {
--- a/jdk/src/share/classes/sun/tools/jstatd/RemoteHostImpl.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/tools/jstatd/RemoteHostImpl.java Wed Jul 05 19:46:31 2017 +0200
@@ -64,7 +64,7 @@
throws RemoteException, MonitorException {
Integer v = new Integer(lvmid);
RemoteVm stub = null;
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
sb.append("local://").append(lvmid).append("@localhost");
if (mode != null) {
--- a/jdk/src/share/classes/sun/tools/native2ascii/N2AFilter.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/tools/native2ascii/N2AFilter.java Wed Jul 05 19:46:31 2017 +0200
@@ -58,7 +58,7 @@
out.write('u');
String hex =
Integer.toHexString(buf[i]);
- StringBuffer hex4 = new StringBuffer(hex);
+ StringBuilder hex4 = new StringBuilder(hex);
hex4.reverse();
int length = 4 - hex4.length();
for (int j = 0; j < length; j++) {
--- a/jdk/src/share/classes/sun/tools/serialver/SerialVer.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/tools/serialver/SerialVer.java Wed Jul 05 19:46:31 2017 +0200
@@ -85,7 +85,7 @@
/* Class not found so far */
}
if (!classFound) {
- StringBuffer workBuffer = new StringBuffer(classname);
+ StringBuilder workBuffer = new StringBuilder(classname);
String workName = workBuffer.toString();
int i;
while ((i = workName.lastIndexOf('.')) != -1 && !classFound) {
--- a/jdk/src/share/classes/sun/tools/tree/FieldExpression.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/tools/tree/FieldExpression.java Wed Jul 05 19:46:31 2017 +0200
@@ -79,21 +79,21 @@
* Convert an '.' expression to a qualified identifier
*/
static public Identifier toIdentifier(Expression e) {
- StringBuffer buf = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
while (e.op == FIELD) {
FieldExpression fe = (FieldExpression)e;
if (fe.id == idThis || fe.id == idClass) {
return null;
}
- buf.insert(0, fe.id);
- buf.insert(0, '.');
+ sb.insert(0, fe.id);
+ sb.insert(0, '.');
e = fe.right;
}
if (e.op != IDENT) {
return null;
}
- buf.insert(0, ((IdentifierExpression)e).id);
- return Identifier.lookup(buf.toString());
+ sb.insert(0, ((IdentifierExpression) e).id);
+ return Identifier.lookup(sb.toString());
}
/**
--- a/jdk/src/share/classes/sun/tools/tree/Vset.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/tools/tree/Vset.java Wed Jul 05 19:46:31 2017 +0200
@@ -495,7 +495,7 @@
public String toString() {
if (this == DEAD_END)
return "{DEAD_END}";
- StringBuffer sb = new StringBuffer("{");
+ StringBuilder sb = new StringBuilder("{");
int maxVar = VBITS * (1 + (x.length+1)/2);
for (int i = 0; i < maxVar; i++) {
if (!testVarUnassigned(i)) {
--- a/jdk/src/share/classes/sun/tracing/PrintStreamProviderFactory.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/classes/sun/tracing/PrintStreamProviderFactory.java Wed Jul 05 19:46:31 2017 +0200
@@ -99,7 +99,7 @@
}
public void uncheckedTrigger(Object[] args) {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
sb.append(provider.getName());
sb.append(".");
sb.append(name);
--- a/jdk/src/share/demo/jvmti/hprof/hprof.h Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/demo/jvmti/hprof/hprof.h Wed Jul 05 19:46:31 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.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -67,10 +67,6 @@
#include "classfile_constants.h"
#include "jvm_md.h"
-#ifndef SKIP_NPT
-#include "npt.h" /* To get NptEnv for doing character conversions */
-#endif
-
/* Macros to extract the upper and lower 32 bits of a jlong */
#define jlong_high(a) ((jint)((a)>>32))
@@ -207,9 +203,6 @@
jvmtiEnv *jvmti; /* JVMTI env for this session */
JavaVM *jvm; /* JavaVM* for this session */
-#ifndef SKIP_NPT
- NptEnv *npt; /* NptEnv* for this session, see npt.h */
-#endif
jint cachedJvmtiVersion; /* JVMTI version number */
char *header; /* "JAVA PROFILE 1.0.[12]" */
--- a/jdk/src/share/demo/jvmti/hprof/hprof_init.c Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/share/demo/jvmti/hprof/hprof_init.c Wed Jul 05 19:46:31 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.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -740,16 +740,11 @@
}
if ( gdata->utf8_output_filename != NULL ) {
- /* UTF-8 to platform encoding (fill in gdata->output_filename) */
+ // Don't attempt to convert output filename.
+ // If fileystem uses the same encoding as the rest of the OS it will work as is.
ulen = (int)strlen(gdata->utf8_output_filename);
gdata->output_filename = (char*)HPROF_MALLOC(ulen*3+3);
-#ifdef SKIP_NPT
(void)strcpy(gdata->output_filename, gdata->utf8_output_filename);
-#else
- (void)(gdata->npt->utf8ToPlatform)
- (gdata->npt->utf, (jbyte*)gdata->utf8_output_filename, ulen,
- gdata->output_filename, ulen*3+3);
-#endif
}
/* By default we turn on gdata->alloc_sites and gdata->heap_dump */
@@ -1949,7 +1944,6 @@
Agent_OnLoad(JavaVM *vm, char *options, void *reserved)
{
char *boot_path = NULL;
- char npt_lib[JVM_MAXPATHLEN];
/* See if it's already loaded */
if ( gdata!=NULL && gdata->isLoaded==JNI_TRUE ) {
@@ -1970,24 +1964,6 @@
/* Get the JVMTI environment */
getJvmti();
-#ifndef SKIP_NPT
- getSystemProperty("sun.boot.library.path", &boot_path);
- /* Load in NPT library for character conversions */
- md_build_library_name(npt_lib, sizeof(npt_lib), boot_path, NPT_LIBNAME);
- if ( strlen(npt_lib) == 0 ) {
- HPROF_ERROR(JNI_TRUE, "Could not find npt library");
- }
- jvmtiDeallocate(boot_path);
- NPT_INITIALIZE(npt_lib, &(gdata->npt), NPT_VERSION, NULL);
- if ( gdata->npt == NULL ) {
- HPROF_ERROR(JNI_TRUE, "Cannot load npt library");
- }
- gdata->npt->utf = (gdata->npt->utfInitialize)(NULL);
- if ( gdata->npt->utf == NULL ) {
- HPROF_ERROR(JNI_TRUE, "Cannot initialize npt utf functions");
- }
-#endif
-
/* Lock needed to protect debug_malloc() code, which is not MT safe */
#ifdef DEBUG
gdata->debug_malloc_lock = createRawMonitor("HPROF debug_malloc lock");
--- a/jdk/src/share/npt/README.txt Thu Jun 19 11:22:36 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +0,0 @@
-
-README: For NPT Library.
-------------------------
-
-To use this Native Platform Toolkit library, you need to add
--Isrc/share/npt and -I/src/${platform}/npt (platform is solaris or windows)
-to your compilation lines.
-
-To initialize/use the library:
-
- #include "npt.h"
-
- NptEnv *npt;
-
- NPT_INITIALIZE(&npt, NPT_VERSION, NULL);
- if (npt == NULL) {
- FATAL_ERROR_MESSAGE(("Unable to gain access to Npt library"));
- }
-
- /* To use the npt utf functions, they require initialization */
- npt->utf = (npt->utfInitialize)(NULL);
- if (npt->utf == NULL) {
- FATAL_ERROR_MESSAGE(("Unable to gain access to Npt utf functions"));
- }
-
- ...
-
-
- /* After all uses is done, it can be terminated, however, if the
- * process will be exiting anyway it isn't necessary, and if
- * you have other threads running that might use these handles
- * you will need to wait here until all those threads have terminated.
- * So in general, termination can be a pain and slow your process
- * termination down.
- */
- (npt->utfTerminate)(npt->utf,NULL);
- NPT_TERMINATE(&npt, NULL);
-
-
--- a/jdk/src/share/npt/npt.c Thu Jun 19 11:22:36 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,90 +0,0 @@
-/*
- * Copyright (c) 2004, 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.
- */
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-
-#include "jni.h"
-
-#include "npt.h"
-
-#include "utf.h"
-
-static int
-version_check(char *version)
-{
- if ( version==NULL || strcmp(version, NPT_VERSION)!=0 ) {
- return 1;
- }
- return 0;
-}
-
-JNIEXPORT void JNICALL
-nptInitialize(NptEnv **pnpt, char *nptVersion, char *options)
-{
- NptEnv *npt;
-
- (*pnpt) = NULL;
-
- if ( version_check(nptVersion) ) {
- NPT_ERROR("NPT version doesn't match");
- return;
- }
-
- npt = (NptEnv*)calloc(sizeof(NptEnv), 1);
- if ( npt == NULL ) {
- NPT_ERROR("Cannot allocate calloc space for NptEnv*");
- return;
- }
-
- if ( options != NULL ) {
- npt->options = strdup(options);
- }
- npt->utfInitialize = &utfInitialize;
- npt->utfTerminate = &utfTerminate;
- npt->utf8ToPlatform = &utf8ToPlatform;
- npt->utf8FromPlatform = &utf8FromPlatform;
- npt->utf8ToUtf16 = &utf8ToUtf16;
- npt->utf16ToUtf8m = &utf16ToUtf8m;
- npt->utf16ToUtf8s = &utf16ToUtf8s;
- npt->utf8sToUtf8mLength = &utf8sToUtf8mLength;
- npt->utf8sToUtf8m = &utf8sToUtf8m;
- npt->utf8mToUtf8sLength = &utf8mToUtf8sLength;
- npt->utf8mToUtf8s = &utf8mToUtf8s;
-
- (*pnpt) = npt;
-}
-
-JNIEXPORT void JNICALL
-nptTerminate(NptEnv* npt, char *options)
-{
-
- /* FIXUP: options? Check memory or something? */
- if ( npt->options != NULL ) {
- (void)free(npt->options);
- }
- (void)free(npt);
-}
--- a/jdk/src/share/npt/npt.h Thu Jun 19 11:22:36 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,109 +0,0 @@
-/*
- * Copyright (c) 2004, 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.
- */
-
-/* Native Platform Toolkit */
-
-#ifndef _NPT_H
-#define _NPT_H
-
-#define NPT_VERSION "0.0.0"
-
-#include <stdio.h>
-
-#include "jni.h"
-
-#include "npt_md.h"
-#include "utf.h"
-
-#define NPT_ERROR(s) { (void)fprintf(stderr, "NPT ERROR: %s\n", s); exit(1); }
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef struct {
-
- /* Used to save handle to our own dynamicly loaded library */
- void *libhandle;
-
- /* Copy of the options sent in at initialization */
- char *options;
-
- /* Can be used to save the UtfInst handle */
- struct UtfInst *utf;
-
- /* UTF interfaces, see utf.c */
- struct UtfInst* (JNICALL *utfInitialize)
- (char *options);
- void (JNICALL *utfTerminate)
- (struct UtfInst *utf, char *options);
- int (JNICALL *utf8ToPlatform)
- (struct UtfInst *utf, jbyte *utf8, int len,
- char *output, int outputMaxLen);
- int (JNICALL *utf8FromPlatform)
- (struct UtfInst *utf, char *str, int len,
- jbyte *output, int outputMaxLen);
- int (JNICALL *utf8ToUtf16)
- (struct UtfInst *utf, jbyte *utf8, int len,
- jchar *output, int outputMaxLen);
- int (JNICALL *utf16ToUtf8m)
- (struct UtfInst *utf, jchar *utf16, int len,
- jbyte *output, int outputMaxLen);
- int (JNICALL *utf16ToUtf8s)
- (struct UtfInst *utf, jchar *utf16, int len,
- jbyte *output, int outputMaxLen);
- int (JNICALL *utf8sToUtf8mLength)
- (struct UtfInst *utf, jbyte *string, int length);
- void (JNICALL *utf8sToUtf8m)
- (struct UtfInst *utf, jbyte *string, int length,
- jbyte *newString, int newLength);
- int (JNICALL *utf8mToUtf8sLength)
- (struct UtfInst *utf, jbyte *string, int length);
- void (JNICALL *utf8mToUtf8s)
- (struct UtfInst *utf, jbyte *string, int length,
- jbyte *newString, int newLength);
-
-} NptEnv;
-
-/* Typedefs for the only 2 'extern' functions in npt library:
- * nptInitialize and nptTerminate
- * See NPT_INITIALIZE() and NPT_TERMINATE() in npt_md.h.
- */
-
-JNIEXPORT void JNICALL nptInitialize
- (NptEnv **pnpt, char *nptVersion, char *options);
-typedef void (JNICALL *NptInitialize)
- (NptEnv **pnpt, char *nptVersion, char *options);
-
-JNIEXPORT void JNICALL nptTerminate
- (NptEnv* npt, char *options);
-typedef void (JNICALL *NptTerminate)
- (NptEnv* npt, char *options);
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif /* __cplusplus */
-
-#endif
--- a/jdk/src/share/npt/utf.c Thu Jun 19 11:22:36 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,500 +0,0 @@
-/*
- * Copyright (c) 2004, 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.
- */
-
-/* Misc functions for conversion of Unicode and UTF-8 and platform encoding */
-
-#include <stdio.h>
-#include <stddef.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <ctype.h>
-
-#include "jni.h"
-
-#include "utf.h"
-
-/*
- * Error handler
- */
-void
-utfError(char *file, int line, char *message)
-{
- (void)fprintf(stderr, "UTF ERROR [\"%s\":%d]: %s\n", file, line, message);
- abort();
-}
-
-/*
- * Convert UTF-8 to UTF-16
- * Returns length or -1 if output overflows.
- */
-int JNICALL
-utf8ToUtf16(struct UtfInst *ui, jbyte *utf8, int len, unsigned short *output, int outputMaxLen)
-{
- int outputLen;
- int i;
-
- UTF_ASSERT(utf8);
- UTF_ASSERT(len>=0);
- UTF_ASSERT(output);
- UTF_ASSERT(outputMaxLen>0);
-
- i = 0;
- outputLen = 0;
- while ( i<len ) {
- unsigned code, x, y, z;
-
- if ( outputLen >= outputMaxLen ) {
- return -1;
- }
- x = (unsigned char)utf8[i++];
- code = x;
- if ( (x & 0xE0)==0xE0 ) {
- y = (unsigned char)utf8[i++];
- z = (unsigned char)utf8[i++];
- code = ((x & 0xF)<<12) + ((y & 0x3F)<<6) + (z & 0x3F);
- } else if ( (x & 0xC0)==0xC0 ) {
- y = (unsigned char)utf8[i++];
- code = ((x & 0x1F)<<6) + (y & 0x3F);
- }
- output[outputLen++] = code;
- }
- return outputLen;
-}
-
-/*
- * Convert UTF-16 to UTF-8 Modified
- * Returns length or -1 if output overflows.
- */
-int JNICALL
-utf16ToUtf8m(struct UtfInst *ui, unsigned short *utf16, int len, jbyte *output, int outputMaxLen)
-{
- int i;
- int outputLen;
-
- UTF_ASSERT(utf16);
- UTF_ASSERT(len>=0);
- UTF_ASSERT(output);
- UTF_ASSERT(outputMaxLen>0);
-
- outputLen = 0;
- for (i = 0; i < len; i++) {
- unsigned code;
-
- code = utf16[i];
- if ( code >= 0x0001 && code <= 0x007F ) {
- if ( outputLen + 1 >= outputMaxLen ) {
- return -1;
- }
- output[outputLen++] = code;
- } else if ( code == 0 || ( code >= 0x0080 && code <= 0x07FF ) ) {
- if ( outputLen + 2 >= outputMaxLen ) {
- return -1;
- }
- output[outputLen++] = ((code>>6) & 0x1F) | 0xC0;
- output[outputLen++] = (code & 0x3F) | 0x80;
- } else if ( code >= 0x0800 && code <= 0xFFFF ) {
- if ( outputLen + 3 >= outputMaxLen ) {
- return -1;
- }
- output[outputLen++] = ((code>>12) & 0x0F) | 0xE0;
- output[outputLen++] = ((code>>6) & 0x3F) | 0x80;
- output[outputLen++] = (code & 0x3F) | 0x80;
- }
- }
- output[outputLen] = 0;
- return outputLen;
-}
-
-int JNICALL
-utf16ToUtf8s(struct UtfInst *ui, unsigned short *utf16, int len, jbyte *output, int outputMaxLen)
-{
- return -1; /* FIXUP */
-}
-
-/* Determine length of this Standard UTF-8 in Modified UTF-8.
- * Validation is done of the basic UTF encoding rules, returns
- * length (no change) when errors are detected in the UTF encoding.
- *
- * Note: Accepts Modified UTF-8 also, no verification on the
- * correctness of Standard UTF-8 is done. e,g, 0xC080 input is ok.
- */
-int JNICALL
-utf8sToUtf8mLength(struct UtfInst *ui, jbyte *string, int length)
-{
- int newLength;
- int i;
-
- newLength = 0;
- for ( i = 0 ; i < length ; i++ ) {
- unsigned byte;
-
- byte = (unsigned char)string[i];
- if ( (byte & 0x80) == 0 ) { /* 1byte encoding */
- newLength++;
- if ( byte == 0 ) {
- newLength++; /* We gain one byte in length on NULL bytes */
- }
- } else if ( (byte & 0xE0) == 0xC0 ) { /* 2byte encoding */
- /* Check encoding of following bytes */
- if ( (i+1) >= length || (string[i+1] & 0xC0) != 0x80 ) {
- break; /* Error condition */
- }
- i++; /* Skip next byte */
- newLength += 2;
- } else if ( (byte & 0xF0) == 0xE0 ) { /* 3byte encoding */
- /* Check encoding of following bytes */
- if ( (i+2) >= length || (string[i+1] & 0xC0) != 0x80
- || (string[i+2] & 0xC0) != 0x80 ) {
- break; /* Error condition */
- }
- i += 2; /* Skip next two bytes */
- newLength += 3;
- } else if ( (byte & 0xF8) == 0xF0 ) { /* 4byte encoding */
- /* Check encoding of following bytes */
- if ( (i+3) >= length || (string[i+1] & 0xC0) != 0x80
- || (string[i+2] & 0xC0) != 0x80
- || (string[i+3] & 0xC0) != 0x80 ) {
- break; /* Error condition */
- }
- i += 3; /* Skip next 3 bytes */
- newLength += 6; /* 4byte encoding turns into 2 3byte ones */
- } else {
- break; /* Error condition */
- }
- }
- if ( i != length ) {
- /* Error in finding new length, return old length so no conversion */
- /* FIXUP: ERROR_MESSAGE? */
- return length;
- }
- return newLength;
-}
-
-/* Convert Standard UTF-8 to Modified UTF-8.
- * Assumes the UTF-8 encoding was validated by utf8mLength() above.
- *
- * Note: Accepts Modified UTF-8 also, no verification on the
- * correctness of Standard UTF-8 is done. e,g, 0xC080 input is ok.
- */
-void JNICALL
-utf8sToUtf8m(struct UtfInst *ui, jbyte *string, int length, jbyte *newString, int newLength)
-{
- int i;
- int j;
-
- j = 0;
- for ( i = 0 ; i < length ; i++ ) {
- unsigned byte1;
-
- byte1 = (unsigned char)string[i];
-
- /* NULL bytes and bytes starting with 11110xxx are special */
- if ( (byte1 & 0x80) == 0 ) { /* 1byte encoding */
- if ( byte1 == 0 ) {
- /* Bits out: 11000000 10000000 */
- newString[j++] = (jbyte)0xC0;
- newString[j++] = (jbyte)0x80;
- } else {
- /* Single byte */
- newString[j++] = byte1;
- }
- } else if ( (byte1 & 0xE0) == 0xC0 ) { /* 2byte encoding */
- newString[j++] = byte1;
- newString[j++] = string[++i];
- } else if ( (byte1 & 0xF0) == 0xE0 ) { /* 3byte encoding */
- newString[j++] = byte1;
- newString[j++] = string[++i];
- newString[j++] = string[++i];
- } else if ( (byte1 & 0xF8) == 0xF0 ) { /* 4byte encoding */
- /* Beginning of 4byte encoding, turn into 2 3byte encodings */
- unsigned byte2, byte3, byte4, u21;
-
- /* Bits in: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */
- byte2 = (unsigned char)string[++i];
- byte3 = (unsigned char)string[++i];
- byte4 = (unsigned char)string[++i];
- /* Reconstruct full 21bit value */
- u21 = (byte1 & 0x07) << 18;
- u21 += (byte2 & 0x3F) << 12;
- u21 += (byte3 & 0x3F) << 6;
- u21 += (byte4 & 0x3F);
- /* Bits out: 11101101 1010xxxx 10xxxxxx */
- newString[j++] = (jbyte)0xED;
- newString[j++] = (jbyte)(0xA0 + (((u21 >> 16) - 1) & 0x0F));
- newString[j++] = (jbyte)(0x80 + ((u21 >> 10) & 0x3F));
- /* Bits out: 11101101 1011xxxx 10xxxxxx */
- newString[j++] = (jbyte)0xED;
- newString[j++] = (jbyte)(0xB0 + ((u21 >> 6) & 0x0F));
- newString[j++] = byte4;
- }
- }
- UTF_ASSERT(i==length);
- UTF_ASSERT(j==newLength);
- newString[j] = (jbyte)0;
-}
-
-/* Given a Modified UTF-8 string, calculate the Standard UTF-8 length.
- * Basic validation of the UTF encoding rules is done, and length is
- * returned (no change) when errors are detected.
- *
- * Note: No validation is made that this is indeed Modified UTF-8 coming in.
- *
- */
-int JNICALL
-utf8mToUtf8sLength(struct UtfInst *ui, jbyte *string, int length)
-{
- int newLength;
- int i;
-
- newLength = 0;
- for ( i = 0 ; i < length ; i++ ) {
- unsigned byte1, byte2, byte3, byte4, byte5, byte6;
-
- byte1 = (unsigned char)string[i];
- if ( (byte1 & 0x80) == 0 ) { /* 1byte encoding */
- newLength++;
- } else if ( (byte1 & 0xE0) == 0xC0 ) { /* 2byte encoding */
- /* Check encoding of following bytes */
- if ( (i+1) >= length || (string[i+1] & 0xC0) != 0x80 ) {
- break; /* Error condition */
- }
- byte2 = (unsigned char)string[++i];
- if ( byte1 != 0xC0 || byte2 != 0x80 ) {
- newLength += 2; /* Normal 2byte encoding, not 0xC080 */
- } else {
- newLength++; /* We will turn 0xC080 into 0 */
- }
- } else if ( (byte1 & 0xF0) == 0xE0 ) { /* 3byte encoding */
- /* Check encoding of following bytes */
- if ( (i+2) >= length || (string[i+1] & 0xC0) != 0x80
- || (string[i+2] & 0xC0) != 0x80 ) {
- break; /* Error condition */
- }
- byte2 = (unsigned char)string[++i];
- byte3 = (unsigned char)string[++i];
- newLength += 3;
- /* Possible process a second 3byte encoding */
- if ( (i+3) < length && byte1 == 0xED && (byte2 & 0xF0) == 0xA0 ) {
- /* See if this is a pair of 3byte encodings */
- byte4 = (unsigned char)string[i+1];
- byte5 = (unsigned char)string[i+2];
- byte6 = (unsigned char)string[i+3];
- if ( byte4 == 0xED && (byte5 & 0xF0) == 0xB0 ) {
- /* Check encoding of 3rd byte */
- if ( (byte6 & 0xC0) != 0x80 ) {
- break; /* Error condition */
- }
- newLength++; /* New string will have 4byte encoding */
- i += 3; /* Skip next 3 bytes */
- }
- }
- } else {
- break; /* Error condition */
- }
- }
- if ( i != length ) {
- /* Error in UTF encoding */
- /* FIXUP: ERROR_MESSAGE()? */
- return length;
- }
- return newLength;
-}
-
-/* Convert a Modified UTF-8 string into a Standard UTF-8 string
- * It is assumed that this string has been validated in terms of the
- * basic UTF encoding rules by utf8Length() above.
- *
- * Note: No validation is made that this is indeed Modified UTF-8 coming in.
- *
- */
-void JNICALL
-utf8mToUtf8s(struct UtfInst *ui, jbyte *string, int length, jbyte *newString, int newLength)
-{
- int i;
- int j;
-
- j = 0;
- for ( i = 0 ; i < length ; i++ ) {
- unsigned byte1, byte2, byte3, byte4, byte5, byte6;
-
- byte1 = (unsigned char)string[i];
- if ( (byte1 & 0x80) == 0 ) { /* 1byte encoding */
- /* Single byte */
- newString[j++] = byte1;
- } else if ( (byte1 & 0xE0) == 0xC0 ) { /* 2byte encoding */
- byte2 = (unsigned char)string[++i];
- if ( byte1 != 0xC0 || byte2 != 0x80 ) {
- newString[j++] = byte1;
- newString[j++] = byte2;
- } else {
- newString[j++] = 0;
- }
- } else if ( (byte1 & 0xF0) == 0xE0 ) { /* 3byte encoding */
- byte2 = (unsigned char)string[++i];
- byte3 = (unsigned char)string[++i];
- if ( i+3 < length && byte1 == 0xED && (byte2 & 0xF0) == 0xA0 ) {
- /* See if this is a pair of 3byte encodings */
- byte4 = (unsigned char)string[i+1];
- byte5 = (unsigned char)string[i+2];
- byte6 = (unsigned char)string[i+3];
- if ( byte4 == 0xED && (byte5 & 0xF0) == 0xB0 ) {
- unsigned u21;
-
- /* Bits in: 11101101 1010xxxx 10xxxxxx */
- /* Bits in: 11101101 1011xxxx 10xxxxxx */
- i += 3;
-
- /* Reconstruct 21 bit code */
- u21 = ((byte2 & 0x0F) + 1) << 16;
- u21 += (byte3 & 0x3F) << 10;
- u21 += (byte5 & 0x0F) << 6;
- u21 += (byte6 & 0x3F);
-
- /* Bits out: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */
-
- /* Convert to 4byte encoding */
- newString[j++] = 0xF0 + ((u21 >> 18) & 0x07);
- newString[j++] = 0x80 + ((u21 >> 12) & 0x3F);
- newString[j++] = 0x80 + ((u21 >> 6) & 0x3F);
- newString[j++] = 0x80 + (u21 & 0x3F);
- continue;
- }
- }
- /* Normal 3byte encoding */
- newString[j++] = byte1;
- newString[j++] = byte2;
- newString[j++] = byte3;
- }
- }
- UTF_ASSERT(i==length);
- UTF_ASSERT(j==newLength);
- newString[j] = 0;
-}
-
-/* ================================================================= */
-
-#ifdef COMPILE_WITH_UTF_TEST /* Test program */
-
-/*
- * Convert any byte array into a printable string.
- * Returns length or -1 if output overflows.
- */
-static int
-bytesToPrintable(struct UtfInst *ui, char *bytes, int len, char *output, int outputMaxLen)
-{
- int outputLen;
- int i;
-
- UTF_ASSERT(bytes);
- UTF_ASSERT(len>=0);
- UTF_ASSERT(output);
- UTF_ASSERT(outputMaxLen>=0);
-
- outputLen = 0;
- for ( i=0; i<len ; i++ ) {
- unsigned byte;
-
- byte = bytes[i];
- if ( byte <= 0x7f && isprint(byte) && !iscntrl(byte) ) {
- if ( outputLen + 1 >= outputMaxLen ) {
- return -1;
- }
- output[outputLen++] = (char)byte;
- } else {
- if ( outputLen + 4 >= outputMaxLen ) {
- return -1;
- }
- (void)sprintf(output+outputLen,"\\x%02x",byte);
- outputLen += 4;
- }
- }
- output[outputLen] = 0;
- return outputLen;
-}
-
-static void
-test(void)
-{
- static char *strings[] = {
- "characters",
- "abcdefghijklmnopqrstuvwxyz",
- "0123456789",
- "!@#$%^&*()_+=-{}[]:;",
- NULL };
- int i;
- struct UtfInst *ui;
-
- ui = utfInitialize(NULL);
-
- i = 0;
- while ( strings[i] != NULL ) {
- char *str;
- #define MAX 1024
- char buf0[MAX];
- char buf1[MAX];
- char buf2[MAX];
- unsigned short buf3[MAX];
- int len1;
- int len2;
- int len3;
-
- str = strings[i];
-
- (void)bytesToPrintable(ui, str, (int)strlen(str), buf0, 1024);
-
- len1 = utf8FromPlatform(ui, str, (int)strlen(str), (jbyte*)buf1, 1024);
-
- UTF_ASSERT(len1==(int)strlen(str));
-
- len3 = utf8ToUtf16(ui, (jbyte*)buf1, len1, (jchar*)buf3, 1024);
-
- UTF_ASSERT(len3==len1);
-
- len1 = utf16ToUtf8m(ui, (jchar*)buf3, len3, (jbyte*)buf1, 1024);
-
- UTF_ASSERT(len1==len3);
- UTF_ASSERT(strcmp(str, buf1) == 0);
-
- len2 = utf8ToPlatform(ui, (jbyte*)buf1, len1, buf2, 1024);
-
- UTF_ASSERT(len2==len1);
- UTF_ASSERT(strcmp(str, buf2) == 0);
-
- i++;
- }
-
- utfTerminate(ui, NULL);
-
-}
-
-int
-main(int argc, char **argv)
-{
- test();
- return 0;
-}
-
-#endif
--- a/jdk/src/share/npt/utf.h Thu Jun 19 11:22:36 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,77 +0,0 @@
-/*
- * Copyright (c) 2004, 2012, 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.
- */
-
-/* Routines for various UTF conversions */
-
-#ifndef _UTF_H
-#define _UTF_H
-
-#include <stdio.h>
-
-#include "jni.h"
-#include "utf_md.h"
-
-/* Use THIS_FILE when it is available. */
-#ifndef THIS_FILE
- #define THIS_FILE __FILE__
-#endif
-
-/* Error and assert macros */
-#define UTF_ERROR(m) utfError(THIS_FILE, __LINE__, m)
-#define UTF_ASSERT(x) ( (x)==0 ? UTF_ERROR("ASSERT ERROR " #x) : (void)0 )
-
-void utfError(char *file, int line, char *message);
-
-struct UtfInst* JNICALL utfInitialize
- (char *options);
-void JNICALL utfTerminate
- (struct UtfInst *ui, char *options);
-int JNICALL utf8ToPlatform
- (struct UtfInst *ui, jbyte *utf8,
- int len, char *output, int outputMaxLen);
-int JNICALL utf8FromPlatform
- (struct UtfInst *ui, char *str, int len,
- jbyte *output, int outputMaxLen);
-int JNICALL utf8ToUtf16
- (struct UtfInst *ui, jbyte *utf8, int len,
- jchar *output, int outputMaxLen);
-int JNICALL utf16ToUtf8m
- (struct UtfInst *ui, jchar *utf16, int len,
- jbyte *output, int outputMaxLen);
-int JNICALL utf16ToUtf8s
- (struct UtfInst *ui, jchar *utf16, int len,
- jbyte *output, int outputMaxLen);
-int JNICALL utf8sToUtf8mLength
- (struct UtfInst *ui, jbyte *string, int length);
-void JNICALL utf8sToUtf8m
- (struct UtfInst *ui, jbyte *string, int length,
- jbyte *new_string, int new_length);
-int JNICALL utf8mToUtf8sLength
- (struct UtfInst *ui, jbyte *string, int length);
-void JNICALL utf8mToUtf8s
- (struct UtfInst *ui, jbyte *string, int length,
- jbyte *new_string, int new_length);
-
-#endif
--- a/jdk/src/solaris/native/java/net/ExtendedOptionsImpl.c Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/solaris/native/java/net/ExtendedOptionsImpl.c Wed Jul 05 19:46:31 2017 +0200
@@ -218,6 +218,9 @@
if (errno == ENOPROTOOPT) {
JNU_ThrowByName(env, "java/lang/UnsupportedOperationException",
"unsupported socket option");
+ } else if (errno == EACCES || errno == EPERM) {
+ NET_ERROR(env, JNU_JAVANETPKG "SocketException",
+ "Permission denied");
} else {
NET_ERROR(env, JNU_JAVANETPKG "SocketException",
"set option SO_FLOW_SLA failed");
@@ -251,6 +254,9 @@
if (errno == ENOPROTOOPT) {
JNU_ThrowByName(env, "java/lang/UnsupportedOperationException",
"unsupported socket option");
+ } else if (errno == EACCES || errno == EPERM) {
+ NET_ERROR(env, JNU_JAVANETPKG "SocketException",
+ "Permission denied");
} else {
NET_ERROR(env, JNU_JAVANETPKG "SocketException",
"set option SO_FLOW_SLA failed");
--- a/jdk/src/solaris/npt/npt_md.h Thu Jun 19 11:22:36 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,69 +0,0 @@
-/*
- * Copyright (c) 2004, 2012, 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.
- */
-
-/* Native Platform Toolkit */
-
-#ifndef _NPT_MD_H
-#define _NPT_MD_H
-
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#include <dlfcn.h>
-#include <jvm_md.h>
-
-#define NPT_LIBNAME "npt"
-
-#define NPT_INITIALIZE(path,pnpt,version,options) \
- { \
- void *_handle; \
- void *_sym; \
- \
- if ( (pnpt) == NULL ) NPT_ERROR("NptEnv* is NULL"); \
- *(pnpt) = NULL; \
- _handle = dlopen(path, RTLD_LAZY); \
- if ( _handle == NULL ) NPT_ERROR("Cannot open library"); \
- _sym = dlsym(_handle, "nptInitialize"); \
- if ( _sym == NULL ) NPT_ERROR("Cannot find nptInitialize"); \
- ((NptInitialize)_sym)((pnpt), version, (options)); \
- if ( (*(pnpt)) == NULL ) NPT_ERROR("Cannot initialize NptEnv"); \
- (*(pnpt))->libhandle = _handle; \
- }
-
-#define NPT_TERMINATE(npt,options) \
- { \
- void *_handle; \
- void *_sym; \
- \
- if ( (npt) == NULL ) NPT_ERROR("NptEnv* is NULL"); \
- _handle = (npt)->libhandle; \
- _sym = dlsym(_handle, "nptTerminate"); \
- if ( _sym == NULL ) NPT_ERROR("Cannot find nptTerminate"); \
- ((NptTerminate)_sym)((npt), (options)); \
- if ( _handle != NULL ) (void)dlclose(_handle); \
- }
-
-
-#endif
--- a/jdk/src/solaris/npt/utf_md.c Thu Jun 19 11:22:36 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,179 +0,0 @@
-/*
- * Copyright (c) 2004, 2005, 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.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <locale.h>
-#include <langinfo.h>
-#include <iconv.h>
-
-#include "utf.h"
-
-/* Global variables */
-
-/*
- * Initialize all utf processing.
- */
-struct UtfInst *JNICALL
-utfInitialize(char *options)
-{
- struct UtfInst *ui;
- char *codeset;
-
- ui = (struct UtfInst*)calloc(sizeof(struct UtfInst), 1);
- ui->iconvToPlatform = (void *)-1;
- ui->iconvFromPlatform = (void *)-1;
-
- /* Set the locale from the environment */
- (void)setlocale(LC_ALL, "");
-
- /* Get the codeset name */
- codeset = (char*)nl_langinfo(CODESET);
- if ( codeset == NULL || codeset[0] == 0 ) {
- return ui;
- }
-
- /* If we don't need this, skip it */
- if (strcmp(codeset, "UTF-8") == 0 || strcmp(codeset, "utf8") == 0 ) {
- return ui;
- }
-
- /* Open conversion descriptors */
- ui->iconvToPlatform = iconv_open(codeset, "UTF-8");
- if ( ui->iconvToPlatform == (void *)-1 ) {
- UTF_ERROR("Failed to complete iconv_open() setup");
- }
- ui->iconvFromPlatform = iconv_open("UTF-8", codeset);
- if ( ui->iconvFromPlatform == (void *)-1 ) {
- UTF_ERROR("Failed to complete iconv_open() setup");
- }
- return ui;
-}
-
-/*
- * Terminate all utf processing
- */
-void JNICALL
-utfTerminate(struct UtfInst *ui, char *options)
-{
- if ( ui->iconvFromPlatform != (void *)-1 ) {
- (void)iconv_close(ui->iconvFromPlatform);
- }
- if ( ui->iconvToPlatform != (void *)-1 ) {
- (void)iconv_close(ui->iconvToPlatform);
- }
- ui->iconvToPlatform = (void *)-1;
- ui->iconvFromPlatform = (void *)-1;
- (void)free(ui);
-}
-
-/*
- * Do iconv() conversion.
- * Returns length or -1 if output overflows.
- */
-static int
-iconvConvert(iconv_t ic, char *bytes, int len, char *output, int outputMaxLen)
-{
- int outputLen = 0;
-
- UTF_ASSERT(bytes);
- UTF_ASSERT(len>=0);
- UTF_ASSERT(output);
- UTF_ASSERT(outputMaxLen>len);
-
- output[0] = 0;
- outputLen = 0;
-
- if ( ic != (iconv_t)(void *)-1 ) {
- int returnValue;
- size_t inLeft;
- size_t outLeft;
- char *inbuf;
- char *outbuf;
-
- inbuf = bytes;
- outbuf = output;
- inLeft = len;
- outLeft = outputMaxLen;
- returnValue = iconv(ic, (void*)&inbuf, &inLeft, &outbuf, &outLeft);
- if ( returnValue >= 0 && inLeft==0 ) {
- outputLen = outputMaxLen-outLeft;
- output[outputLen] = 0;
- return outputLen;
- }
-
- /* Failed to do the conversion */
- return -1;
- }
-
- /* Just copy bytes */
- outputLen = len;
- (void)memcpy(output, bytes, len);
- output[len] = 0;
- return outputLen;
-}
-
-/*
- * Convert UTF-8 to Platform Encoding.
- * Returns length or -1 if output overflows.
- */
-int JNICALL
-utf8ToPlatform(struct UtfInst*ui, jbyte *utf8, int len, char *output, int outputMaxLen)
-{
- /* Negative length is an error */
- if ( len < 0 ) {
- return -1;
- }
-
- /* Zero length is ok, but we don't need to do much */
- if ( len == 0 ) {
- output[0] = 0;
- return 0;
- }
-
- return iconvConvert(ui->iconvToPlatform, (char*)utf8, len, output, outputMaxLen);
-}
-
-/*
- * Convert Platform Encoding to UTF-8.
- * Returns length or -1 if output overflows.
- */
-int JNICALL
-utf8FromPlatform(struct UtfInst*ui, char *str, int len, jbyte *output, int outputMaxLen)
-{
- /* Negative length is an error */
- if ( len < 0 ) {
- return -1;
- }
-
- /* Zero length is ok, but we don't need to do much */
- if ( len == 0 ) {
- output[0] = 0;
- return 0;
- }
-
- return iconvConvert(ui->iconvFromPlatform, str, len, (char*)output, outputMaxLen);
-}
--- a/jdk/src/solaris/npt/utf_md.h Thu Jun 19 11:22:36 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-/*
- * Copyright (c) 2004, 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.
- */
-
-#ifndef _UTF_MD_H
-#define _UTF_MD_H
-
-struct UtfInst {
- void *iconvToPlatform;
- void *iconvFromPlatform;
-};
-
-#endif
--- a/jdk/src/windows/native/sun/security/provider/WinCAPISeedGenerator.c Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/src/windows/native/sun/security/provider/WinCAPISeedGenerator.c Wed Jul 05 19:46:31 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 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
@@ -59,11 +59,16 @@
numBytes = (*env)->GetArrayLength(env, randArray);
randBytes = (*env)->GetByteArrayElements(env, randArray, NULL);
+ if (randBytes == NULL) {
+ goto cleanup;
+ }
+
if (CryptGenRandom(hCryptProv, numBytes, randBytes)) {
result = JNI_TRUE;
}
(*env)->ReleaseByteArrayElements(env, randArray, randBytes, 0);
+cleanup:
CryptReleaseContext(hCryptProv, 0);
return result;
--- a/jdk/src/windows/npt/npt_md.h Thu Jun 19 11:22:36 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,68 +0,0 @@
-/*
- * Copyright (c) 2004, 2012, 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.
- */
-
-/* Native Platform Toolkit */
-
-#ifndef _NPT_MD_H
-#define _NPT_MD_H
-
-#include <windows.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-
-#define NPT_LIBNAME "npt"
-
-#define NPT_INITIALIZE(path,pnpt,version,options) \
- { \
- void *_handle; \
- void *_sym; \
- \
- if ( (pnpt) == NULL ) NPT_ERROR("NptEnv* is NULL"); \
- *(pnpt) = NULL; \
- _handle = LoadLibrary(path); \
- if ( _handle == NULL ) NPT_ERROR("Cannot open library"); \
- _sym = GetProcAddress(_handle, "nptInitialize"); \
- if ( _sym == NULL ) NPT_ERROR("Cannot find nptInitialize"); \
- ((NptInitialize)_sym)((pnpt), version, (options)); \
- if ( *(pnpt) == NULL ) NPT_ERROR("Cannot initialize NptEnv"); \
- (*(pnpt))->libhandle = _handle; \
- }
-
-#define NPT_TERMINATE(npt,options) \
- { \
- void *_handle; \
- void *_sym; \
- \
- if ( (npt) == NULL ) NPT_ERROR("NptEnv* is NULL"); \
- _handle = (npt)->libhandle; \
- if ( _handle == NULL ) NPT_ERROR("npt->libhandle is NULL"); \
- _sym = GetProcAddress(_handle, "nptTerminate"); \
- if ( _sym == NULL ) NPT_ERROR("Cannot find nptTerminate"); \
- ((NptTerminate)_sym)((npt), (options)); \
- (void)FreeLibrary(_handle); \
- }
-
-#endif
--- a/jdk/src/windows/npt/utf_md.c Thu Jun 19 11:22:36 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,172 +0,0 @@
-/*
- * Copyright (c) 2004, 2005, 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.
- */
-
-#include "utf.h"
-
-#include <windows.h>
-#include <stdlib.h>
-#include <stdio.h>
-
-/*
- * Initialize all utf processing.
- */
-struct UtfInst * JNICALL
-utfInitialize(char *options)
-{
- struct UtfInst *ui;
- LANGID langID;
- LCID localeID;
- TCHAR strCodePage[7]; // ANSI code page id
-
- ui = (struct UtfInst*)calloc(sizeof(struct UtfInst), 1);
-
- /*
- * Get the code page for this locale
- */
- langID = LANGIDFROMLCID(GetUserDefaultLCID());
- localeID = MAKELCID(langID, SORT_DEFAULT);
- if (GetLocaleInfo(localeID, LOCALE_IDEFAULTANSICODEPAGE,
- strCodePage, sizeof(strCodePage)/sizeof(TCHAR)) > 0 ) {
- ui->platformCodePage = atoi(strCodePage);
- } else {
- ui->platformCodePage = GetACP();
- }
- return ui;
-}
-
-/*
- * Terminate all utf processing
- */
-void JNICALL
-utfTerminate(struct UtfInst *ui, char *options)
-{
- (void)free(ui);
-}
-
-/*
- * Get wide string (assumes len>0)
- */
-static WCHAR*
-getWideString(UINT codePage, char* str, int len, int *pwlen)
-{
- int wlen;
- WCHAR* wstr;
-
- /* Convert the string to WIDE string */
- wlen = MultiByteToWideChar(codePage, 0, str, len, NULL, 0);
- *pwlen = wlen;
- if (wlen <= 0) {
- UTF_ERROR(("Can't get WIDE string length"));
- return NULL;
- }
- wstr = (WCHAR*)malloc(wlen * sizeof(WCHAR));
- if (wstr == NULL) {
- UTF_ERROR(("Can't malloc() any space"));
- return NULL;
- }
- if (MultiByteToWideChar(codePage, 0, str, len, wstr, wlen) == 0) {
- UTF_ERROR(("Can't get WIDE string"));
- return NULL;
- }
- return wstr;
-}
-
-/*
- * Convert UTF-8 to a platform string
- */
-int JNICALL
-utf8ToPlatform(struct UtfInst *ui, jbyte *utf8, int len, char* output, int outputMaxLen)
-{
- int wlen;
- int plen;
- WCHAR* wstr;
-
- /* Negative length is an error */
- if ( len < 0 ) {
- return -1;
- }
-
- /* Zero length is ok, but we don't need to do much */
- if ( len == 0 ) {
- output[0] = 0;
- return 0;
- }
-
- /* Get WIDE string version (assumes len>0) */
- wstr = getWideString(CP_UTF8, (char*)utf8, len, &wlen);
- if ( wstr == NULL ) {
- return -1;
- }
-
- /* Convert WIDE string to MultiByte string */
- plen = WideCharToMultiByte(ui->platformCodePage, 0, wstr, wlen,
- output, outputMaxLen, NULL, NULL);
- free(wstr);
- if (plen <= 0) {
- UTF_ERROR(("Can't convert WIDE string to multi-byte"));
- return -1;
- }
- output[plen] = '\0';
- return plen;
-}
-
-/*
- * Convert Platform Encoding to UTF-8.
- */
-int JNICALL
-utf8FromPlatform(struct UtfInst *ui, char *str, int len, jbyte *output, int outputMaxLen)
-{
- int wlen;
- int plen;
- WCHAR* wstr;
-
- /* Negative length is an error */
- if ( len < 0 ) {
- return -1;
- }
-
- /* Zero length is ok, but we don't need to do much */
- if ( len == 0 ) {
- output[0] = 0;
- return 0;
- }
-
- /* Get WIDE string version (assumes len>0) */
- wstr = getWideString(ui->platformCodePage, str, len, &wlen);
- if ( wstr == NULL ) {
- return -1;
- }
-
- /* Convert WIDE string to UTF-8 string */
- plen = WideCharToMultiByte(CP_UTF8, 0, wstr, wlen,
- (char*)output, outputMaxLen, NULL, NULL);
- free(wstr);
- if (plen <= 0) {
- UTF_ERROR(("Can't convert WIDE string to multi-byte"));
- return -1;
- }
- output[plen] = '\0';
- return plen;
-}
--- a/jdk/src/windows/npt/utf_md.h Thu Jun 19 11:22:36 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-/*
- * Copyright (c) 2004, 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.
- */
-
-#ifndef _UTF_MD_H
-#define _UTF_MD_H
-
-struct UtfInst {
- unsigned int platformCodePage;
-};
-
-#endif
--- a/jdk/test/ProblemList.txt Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/ProblemList.txt Wed Jul 05 19:46:31 2017 +0200
@@ -124,6 +124,10 @@
# jdk_management
+# 8046351
+com/sun/management/GarbageCollectorMXBean/GarbageCollectionNotificationContentTest.java generic-all
+com/sun/management/GarbageCollectorMXBean/GarbageCollectionNotificationTest.java generic-all
+
############################################################################
# jdk_jmx
@@ -264,7 +268,6 @@
# 8044419
com/sun/jdi/JdbReadTwiceTest.sh generic-all
-
############################################################################
# jdk_util
@@ -292,4 +295,10 @@
# 8037285
sun/tools/jstatd/TestJstatdServer.java generic-all
+# 8046355
+sun/tools/jstatd/TestJstatdExternalRegistry.java generic-all
+
+# 8046352
+com/sun/tools/attach/TempDirTest.java generic-all
+
############################################################################
--- a/jdk/test/com/sun/jdi/AccessSpecifierTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/AccessSpecifierTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -30,7 +30,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g AccessSpecifierTest.java
- * @run main AccessSpecifierTest
+ * @run driver AccessSpecifierTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/AfterThreadDeathTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/AfterThreadDeathTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -30,7 +30,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g AfterThreadDeathTest.java
- * @run main AfterThreadDeathTest
+ * @run driver AfterThreadDeathTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/AllLineLocations.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/AllLineLocations.java Wed Jul 05 19:46:31 2017 +0200
@@ -32,7 +32,7 @@
* @run compile -g RefTypes.java
* @run build AllLineLocations
*
- * @run main AllLineLocations RefTypes
+ * @run driver AllLineLocations RefTypes
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/AnyDebuggeeTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/AnyDebuggeeTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -29,7 +29,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g AnyDebuggeeTest.java
- * @run main AnyDebuggeeeTest
+ * @run driver AnyDebuggeeeTest
*
* This test is intended to be run manually to investigate behaviors;
* it is not an actual test of any specific functionality, it just
--- a/jdk/test/com/sun/jdi/ArgumentValuesTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/ArgumentValuesTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -7,7 +7,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile ArgumentValuesTest.java
- * @run main ArgumentValuesTest
+ * @run driver ArgumentValuesTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/ArrayRangeTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/ArrayRangeTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -32,7 +32,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g ArrayRangeTest.java
- * @run main ArrayRangeTest
+ * @run driver ArrayRangeTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/BacktraceFieldTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/BacktraceFieldTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -30,7 +30,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g BacktraceFieldTest.java
- * @run main BacktraceFieldTest
+ * @run driver BacktraceFieldTest
*/
/*
--- a/jdk/test/com/sun/jdi/BadHandshakeTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/BadHandshakeTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -27,7 +27,7 @@
* @library /lib/testlibrary
*
* @build jdk.testlibrary.* VMConnection BadHandshakeTest Exit0
- * @run main BadHandshakeTest
+ * @run driver BadHandshakeTest
*
*/
import java.net.Socket;
--- a/jdk/test/com/sun/jdi/BreakpointTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/BreakpointTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -30,7 +30,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g BreakpointTest.java
- * @run main BreakpointTest
+ * @run driver BreakpointTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/ClassLoaderClassesTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/ClassLoaderClassesTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -32,7 +32,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g ClassLoaderClassesTest.java
- * @run main ClassLoaderClassesTest
+ * @run driver ClassLoaderClassesTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/ClassesByName.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/ClassesByName.java Wed Jul 05 19:46:31 2017 +0200
@@ -34,7 +34,7 @@
* @summary ClassesByName verifies that all the classes in the
* loaded class list can be found with classesByName..
*
- * @run main ClassesByName HelloWorld
+ * @run driver ClassesByName HelloWorld
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/ClassesByName2Test.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/ClassesByName2Test.java Wed Jul 05 19:46:31 2017 +0200
@@ -30,7 +30,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g ClassesByName2Test.java
- * @run main ClassesByName2Test
+ * @run driver ClassesByName2Test
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/ConnectedVMs.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/ConnectedVMs.java Wed Jul 05 19:46:31 2017 +0200
@@ -28,10 +28,10 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g InstTarg.java
- * @run main ConnectedVMs Kill
- * @run main ConnectedVMs Resume-to-exit
- * @run main ConnectedVMs dispose()
- * @run main ConnectedVMs exit()
+ * @run driver ConnectedVMs Kill
+ * @run driver ConnectedVMs Resume-to-exit
+ * @run driver ConnectedVMs dispose()
+ * @run driver ConnectedVMs exit()
*
* @summary ConnectedVMs checks the method
* VirtualMachineManager.connectedVirtualMachines()
--- a/jdk/test/com/sun/jdi/ConstantPoolInfo.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/ConstantPoolInfo.java Wed Jul 05 19:46:31 2017 +0200
@@ -30,7 +30,7 @@
*
* @run build TestScaffold VMConnection
* @run compile -g ConstantPoolInfo.java
- * @run main ConstantPoolInfo
+ * @run driver ConstantPoolInfo
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/CountEvent.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/CountEvent.java Wed Jul 05 19:46:31 2017 +0200
@@ -31,7 +31,7 @@
*
* @run build TestScaffold VMConnection TargetAdapter TargetListener
* @run compile -g CountEvent.java
- * @run main CountEvent
+ * @run driver CountEvent
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/CountFilterTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/CountFilterTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -30,7 +30,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g CountFilterTest.java
- * @run main CountFilterTest
+ * @run driver CountFilterTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/DataModelTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/DataModelTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -34,7 +34,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g DataModelTest.java
- * @run main DataModelTest
+ * @run driver DataModelTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/DebuggerThreadTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/DebuggerThreadTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -30,7 +30,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g DebuggerThreadTest.java
- * @run main DebuggerThreadTest
+ * @run driver DebuggerThreadTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/DeleteAllBkptsTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/DeleteAllBkptsTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -31,7 +31,7 @@
* @library ..
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g DeleteAllBkptsTest.java
- * @run main DeleteAllBkptsTest
+ * @run driver DeleteAllBkptsTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/DeleteEventRequestsTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/DeleteEventRequestsTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -30,7 +30,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g DeleteEventRequestsTest.java
- * @run main DeleteEventRequestsTest
+ * @run driver DeleteEventRequestsTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/DoubleAgentTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/DoubleAgentTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -26,14 +26,13 @@
* @summary Check that a double agent request fails
*
* @build VMConnection DoubleAgentTest Exit0
- * @run main DoubleAgentTest
+ * @run driver DoubleAgentTest
*
*/
import java.io.InputStream;
import java.io.IOException;
import java.io.File;
import java.net.ServerSocket;
-import java.net.Socket;
public class DoubleAgentTest {
--- a/jdk/test/com/sun/jdi/EarlyReturnNegativeTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/EarlyReturnNegativeTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -29,7 +29,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g EarlyReturnNegativeTest.java
- * @run main EarlyReturnNegativeTest
+ * @run driver EarlyReturnNegativeTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/EarlyReturnTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/EarlyReturnTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -36,7 +36,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g EarlyReturnTest.java
- * @run main EarlyReturnTest
+ * @run driver EarlyReturnTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/EnumTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/EnumTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -30,7 +30,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g EnumTest.java
- * @run main EnumTest
+ * @run driver EnumTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/EventQueueDisconnectTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/EventQueueDisconnectTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -28,7 +28,7 @@
*
* @run build VMConnection
* @run compile -g EventQueueDisconnectTest.java
- * @run main EventQueueDisconnectTest
+ * @run driver EventQueueDisconnectTest
*
* @summary EventQueueDisconnectTest checks to see that
* VMDisconnectedException is never thrown before VMDisconnectEvent.
@@ -64,7 +64,7 @@
"com.sun.jdi.CommandLineLaunch:",
VirtualMachine.TRACE_NONE);
connection.setConnectorArg("main", "EventQueueDisconnectTarg");
- String debuggeeVMOptions = connection.getDebuggeeVMOptions();
+ String debuggeeVMOptions = VMConnection.getDebuggeeVMOptions();
if (!debuggeeVMOptions.equals("")) {
if (connection.connectorArg("options").length() > 0) {
throw new IllegalArgumentException("VM options in two places");
--- a/jdk/test/com/sun/jdi/ExceptionEvents.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/ExceptionEvents.java Wed Jul 05 19:46:31 2017 +0200
@@ -32,32 +32,32 @@
* @run build TestScaffold VMConnection
* @run compile -g ExceptionEvents.java
*
- * @run main/othervm ExceptionEvents N A StackOverflowCaughtTarg java.lang.Exception
- * @run main/othervm ExceptionEvents C A StackOverflowCaughtTarg null
- * @run main/othervm ExceptionEvents C A StackOverflowCaughtTarg java.lang.Error
- * @run main/othervm ExceptionEvents C A StackOverflowCaughtTarg java.lang.StackOverflowError
- * @run main/othervm ExceptionEvents N A StackOverflowCaughtTarg java.lang.NullPointerException
+ * @run driver ExceptionEvents N A StackOverflowCaughtTarg java.lang.Exception
+ * @run driver ExceptionEvents C A StackOverflowCaughtTarg null
+ * @run driver ExceptionEvents C A StackOverflowCaughtTarg java.lang.Error
+ * @run driver ExceptionEvents C A StackOverflowCaughtTarg java.lang.StackOverflowError
+ * @run driver ExceptionEvents N A StackOverflowCaughtTarg java.lang.NullPointerException
- * @run main/othervm ExceptionEvents N T StackOverflowCaughtTarg java.lang.Exception
- * @run main/othervm ExceptionEvents C T StackOverflowCaughtTarg null
- * @run main/othervm ExceptionEvents C T StackOverflowCaughtTarg java.lang.Error
- * @run main/othervm ExceptionEvents C T StackOverflowCaughtTarg java.lang.StackOverflowError
- * @run main/othervm ExceptionEvents N T StackOverflowCaughtTarg java.lang.NullPointerException
+ * @run driver ExceptionEvents N T StackOverflowCaughtTarg java.lang.Exception
+ * @run driver ExceptionEvents C T StackOverflowCaughtTarg null
+ * @run driver ExceptionEvents C T StackOverflowCaughtTarg java.lang.Error
+ * @run driver ExceptionEvents C T StackOverflowCaughtTarg java.lang.StackOverflowError
+ * @run driver ExceptionEvents N T StackOverflowCaughtTarg java.lang.NullPointerException
- * @run main/othervm ExceptionEvents N N StackOverflowCaughtTarg java.lang.Exception
- * @run main/othervm ExceptionEvents C N StackOverflowCaughtTarg null
- * @run main/othervm ExceptionEvents C N StackOverflowCaughtTarg java.lang.Error
- * @run main/othervm ExceptionEvents C N StackOverflowCaughtTarg java.lang.StackOverflowError
- * @run main/othervm ExceptionEvents N N StackOverflowCaughtTarg java.lang.NullPointerException
+ * @run driver ExceptionEvents N N StackOverflowCaughtTarg java.lang.Exception
+ * @run driver ExceptionEvents C N StackOverflowCaughtTarg null
+ * @run driver ExceptionEvents C N StackOverflowCaughtTarg java.lang.Error
+ * @run driver ExceptionEvents C N StackOverflowCaughtTarg java.lang.StackOverflowError
+ * @run driver ExceptionEvents N N StackOverflowCaughtTarg java.lang.NullPointerException
- * @run main/othervm ExceptionEvents N A StackOverflowUncaughtTarg java.lang.Exception
- * @run main/othervm ExceptionEvents U A StackOverflowUncaughtTarg null
- * @run main/othervm ExceptionEvents U A StackOverflowUncaughtTarg java.lang.Error
- * @run main/othervm ExceptionEvents U A StackOverflowUncaughtTarg java.lang.StackOverflowError
- * @run main/othervm ExceptionEvents N A StackOverflowUncaughtTarg java.lang.NullPointerException
+ * @run driver ExceptionEvents N A StackOverflowUncaughtTarg java.lang.Exception
+ * @run driver ExceptionEvents U A StackOverflowUncaughtTarg null
+ * @run driver ExceptionEvents U A StackOverflowUncaughtTarg java.lang.Error
+ * @run driver ExceptionEvents U A StackOverflowUncaughtTarg java.lang.StackOverflowError
+ * @run driver ExceptionEvents N A StackOverflowUncaughtTarg java.lang.NullPointerException
- * @run main/othervm ExceptionEvents N T StackOverflowUncaughtTarg java.lang.NullPointerException
- * @run main/othervm ExceptionEvents N N StackOverflowUncaughtTarg java.lang.NullPointerException
+ * @run driver ExceptionEvents N T StackOverflowUncaughtTarg java.lang.NullPointerException
+ * @run driver ExceptionEvents N N StackOverflowUncaughtTarg java.lang.NullPointerException
*/
import com.sun.jdi.*;
--- a/jdk/test/com/sun/jdi/ExclusiveBind.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/ExclusiveBind.java Wed Jul 05 19:46:31 2017 +0200
@@ -28,7 +28,7 @@
* @library /lib/testlibrary
*
* @build jdk.testlibrary.* VMConnection ExclusiveBind HelloWorld
- * @run main ExclusiveBind
+ * @run driver ExclusiveBind
*/
import java.net.ServerSocket;
import com.sun.jdi.Bootstrap;
--- a/jdk/test/com/sun/jdi/ExpiredRequestDeletionTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/ExpiredRequestDeletionTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -31,7 +31,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g ExpiredRequestDeletionTest.java
- * @run main ExpiredRequestDeletionTest
+ * @run driver ExpiredRequestDeletionTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/FetchLocals.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/FetchLocals.java Wed Jul 05 19:46:31 2017 +0200
@@ -7,7 +7,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g FetchLocals.java
- * @run main FetchLocals
+ * @run driver FetchLocals
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/FieldWatchpoints.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/FieldWatchpoints.java Wed Jul 05 19:46:31 2017 +0200
@@ -30,7 +30,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g FieldWatchpoints.java
- * @run main/othervm FieldWatchpoints
+ * @run driver FieldWatchpoints
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/FilterMatch.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/FilterMatch.java Wed Jul 05 19:46:31 2017 +0200
@@ -31,7 +31,7 @@
* @library scaffold
* @run build JDIScaffold VMConnection
* @run compile -g HelloWorld.java
- * @run main/othervm FilterMatch
+ * @run driver FilterMatch
*/
/* Look at patternMatch in JDK file:
--- a/jdk/test/com/sun/jdi/FilterNoMatch.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/FilterNoMatch.java Wed Jul 05 19:46:31 2017 +0200
@@ -31,7 +31,7 @@
* @library scaffold
* @run build JDIScaffold VMConnection
* @run compile -g HelloWorld.java
- * @run main/othervm FilterNoMatch
+ * @run driver FilterNoMatch
*/
/* This tests the patternMatch function in JDK file:
--- a/jdk/test/com/sun/jdi/FinalLocalsTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/FinalLocalsTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -32,7 +32,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g FinalLocalsTest.java
- * @run main FinalLocalsTest
+ * @run driver FinalLocalsTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/FinalizerTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/FinalizerTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -30,7 +30,7 @@
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g FinalizerTest.java
*
- * @run main FinalizerTest
+ * @run driver FinalizerTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/FramesTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/FramesTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -30,7 +30,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g FramesTest.java
- * @run main FramesTest
+ * @run driver FramesTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/GenericsTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/GenericsTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -30,7 +30,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g GenericsTest.java
- * @run main GenericsTest
+ * @run driver GenericsTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/GetLocalVariables.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/GetLocalVariables.java Wed Jul 05 19:46:31 2017 +0200
@@ -7,7 +7,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g GetLocalVariables.java
- * @run main GetLocalVariables
+ * @run driver GetLocalVariables
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/GetLocalVariables2Test.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/GetLocalVariables2Test.java Wed Jul 05 19:46:31 2017 +0200
@@ -30,7 +30,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g GetLocalVariables2Test.java
- * @run main GetLocalVariables2Test
+ * @run driver GetLocalVariables2Test
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/GetSetLocalTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/GetSetLocalTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -7,7 +7,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g GetSetLocalTest.java
- * @run main GetSetLocalTest
+ * @run driver GetSetLocalTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/GetUninitializedStringValue.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/GetUninitializedStringValue.java Wed Jul 05 19:46:31 2017 +0200
@@ -30,7 +30,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g GetUninitializedStringValue.java
- * @run main GetUninitializedStringValue
+ * @run driver GetUninitializedStringValue
*/
import com.sun.jdi.ReferenceType;
import com.sun.jdi.StackFrame;
--- a/jdk/test/com/sun/jdi/HomeTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/HomeTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -30,7 +30,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g HomeTest.java
- * @run main HomeTest
+ * @run driver HomeTest
*/
import com.sun.jdi.*;
import com.sun.jdi.connect.*;
--- a/jdk/test/com/sun/jdi/InstanceFilter.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/InstanceFilter.java Wed Jul 05 19:46:31 2017 +0200
@@ -31,7 +31,7 @@
*
* @run build TestScaffold VMConnection TargetAdapter TargetListener
* @run compile -g InstanceFilter.java
- * @run main/othervm InstanceFilter
+ * @run driver InstanceFilter
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/InstancesTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/InstancesTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -29,7 +29,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g InstancesTest.java
- * @run main InstancesTest
+ * @run driver InstancesTest
*/
/*
--- a/jdk/test/com/sun/jdi/InterfaceMethodsTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/InterfaceMethodsTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -28,7 +28,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run build InterfaceMethodsTest
- * @run main InterfaceMethodsTest
+ * @run driver InterfaceMethodsTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/InterruptHangTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/InterruptHangTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -7,7 +7,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g InterruptHangTest.java
- * @run main InterruptHangTest
+ * @run driver InterruptHangTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/InvokeHangTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/InvokeHangTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -30,7 +30,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g InvokeHangTest.java
- * @run main InvokeHangTest
+ * @run driver InvokeHangTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/InvokeTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/InvokeTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -31,7 +31,7 @@
* @library ..
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g InvokeTest.java
- * @run main InvokeTest
+ * @run driver InvokeTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/JITDebug.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/JITDebug.java Wed Jul 05 19:46:31 2017 +0200
@@ -46,7 +46,7 @@
* assure that launching on uncaught exception works
*
* @author Robert Field
- * @run main/othervm JITDebug
+ * @run driver JITDebug
*/
import com.sun.jdi.*;
--- a/jdk/test/com/sun/jdi/Java_gTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/Java_gTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -30,7 +30,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g Java_gTest.java
- * @run main Java_gTest
+ * @run driver Java_gTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/LambdaBreakpointTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/LambdaBreakpointTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -31,7 +31,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g LambdaBreakpointTest.java
- * @run main LambdaBreakpointTest
+ * @run driver LambdaBreakpointTest
*/
import java.util.List;
--- a/jdk/test/com/sun/jdi/LambdaStepTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/LambdaStepTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -29,7 +29,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g LambdaStepTest.java
- * @run main LambdaStepTest
+ * @run driver LambdaStepTest
*/
import com.sun.jdi.LocalVariable;
import com.sun.jdi.ObjectReference;
--- a/jdk/test/com/sun/jdi/LaunchCommandLine.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/LaunchCommandLine.java Wed Jul 05 19:46:31 2017 +0200
@@ -32,7 +32,7 @@
* @run compile -g HelloWorld.java
* @run build LaunchCommandLine
*
- * @run main LaunchCommandLine
+ * @run driver LaunchCommandLine
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/LineNumberInfo.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/LineNumberInfo.java Wed Jul 05 19:46:31 2017 +0200
@@ -30,7 +30,7 @@
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g LineNumberInfo.java ControlFlow.java
*
- * @run main LineNumberInfo
+ * @run driver LineNumberInfo
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/LineNumberOnBraceTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/LineNumberOnBraceTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -7,7 +7,7 @@
*
* @run build VMConnection TargetListener TargetAdapter
* @run compile -g LineNumberOnBraceTest.java
- * @run main LineNumberOnBraceTest
+ * @run driver LineNumberOnBraceTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/LocalVariableEqual.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/LocalVariableEqual.java Wed Jul 05 19:46:31 2017 +0200
@@ -30,7 +30,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g LocalVariableEqual.java
- * @run main LocalVariableEqual
+ * @run driver LocalVariableEqual
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/LocationTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/LocationTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -30,7 +30,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g LocationTest.java
- * @run main LocationTest
+ * @run driver LocationTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/MethodEntryExitEvents.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/MethodEntryExitEvents.java Wed Jul 05 19:46:31 2017 +0200
@@ -29,9 +29,9 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g MethodEntryExitEvents.java
- * @run main MethodEntryExitEvents SUSPEND_EVENT_THREAD MethodEntryExitEventsDebugee
- * @run main MethodEntryExitEvents SUSPEND_NONE MethodEntryExitEventsDebugee
- * @run main MethodEntryExitEvents SUSPEND_ALL MethodEntryExitEventsDebugee
+ * @run driver MethodEntryExitEvents SUSPEND_EVENT_THREAD MethodEntryExitEventsDebugee
+ * @run driver MethodEntryExitEvents SUSPEND_NONE MethodEntryExitEventsDebugee
+ * @run driver MethodEntryExitEvents SUSPEND_ALL MethodEntryExitEventsDebugee
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/MethodExitReturnValuesTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/MethodExitReturnValuesTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -29,7 +29,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g MethodExitReturnValuesTest.java
- * @run main MethodExitReturnValuesTest
+ * @run driver MethodExitReturnValuesTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/ModificationWatchpoints.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/ModificationWatchpoints.java Wed Jul 05 19:46:31 2017 +0200
@@ -32,7 +32,7 @@
* @library scaffold
* @run build JDIScaffold VMConnection
* @run compile -g ModificationWatchpoints.java
- * @run main/othervm ModificationWatchpoints
+ * @run driver ModificationWatchpoints
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/MonitorEventTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/MonitorEventTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -30,7 +30,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g MonitorEventTest.java
- * @run main MonitorEventTest
+ * @run driver MonitorEventTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/MonitorFrameInfo.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/MonitorFrameInfo.java Wed Jul 05 19:46:31 2017 +0200
@@ -31,7 +31,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g MonitorFrameInfo.java
- * @run main MonitorFrameInfo
+ * @run driver MonitorFrameInfo
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/MultiBreakpointsTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/MultiBreakpointsTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -31,7 +31,7 @@
*
* @build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g MultiBreakpointsTest.java
- * @run main MultiBreakpointsTest
+ * @run driver MultiBreakpointsTest
*/
/*
--- a/jdk/test/com/sun/jdi/NativeInstanceFilter.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/NativeInstanceFilter.java Wed Jul 05 19:46:31 2017 +0200
@@ -31,7 +31,7 @@
* @library scaffold
* @run build JDIScaffold VMConnection
* @compile -XDignore.symbol.file NativeInstanceFilterTarg.java
- * @run main/othervm NativeInstanceFilter
+ * @run driver NativeInstanceFilter
*/
/*
--- a/jdk/test/com/sun/jdi/NewInstanceTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/NewInstanceTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -31,7 +31,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g NewInstanceTest.java
- * @run main NewInstanceTest
+ * @run driver NewInstanceTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/NoLaunchOptionTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/NoLaunchOptionTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -29,7 +29,7 @@
*
* @run compile -g NoLaunchOptionTest.java
* @build VMConnection
- * @run main/othervm NoLaunchOptionTest
+ * @run driver NoLaunchOptionTest
*/
import java.net.ServerSocket;
--- a/jdk/test/com/sun/jdi/NoLocInfoTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/NoLocInfoTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -31,7 +31,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g:none NoLocInfoTest.java
- * @run main NoLocInfoTest
+ * @run driver NoLocInfoTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/NullThreadGroupNameTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/NullThreadGroupNameTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -27,7 +27,7 @@
* @summary Ensure that JDWP doesn't crash with a null thread group name
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
- * @run main NullThreadGroupNameTest
+ * @run driver NullThreadGroupNameTest
*/
import com.sun.jdi.*;
import com.sun.jdi.connect.*;
--- a/jdk/test/com/sun/jdi/OnThrowTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/OnThrowTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -30,7 +30,7 @@
* @run compile -g OnThrowTest.java
* @run compile -g OnThrowTarget.java
* @run compile -g VMConnection.java
- * @run main/othervm OnThrowTest
+ * @run driver OnThrowTest
*/
import java.io.File;
--- a/jdk/test/com/sun/jdi/OptionTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/OptionTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -30,7 +30,7 @@
* @run compile -g OptionTest.java
* @run compile -g HelloWorld.java
* @run compile -g VMConnection.java
- * @run main/othervm OptionTest
+ * @run driver OptionTest
*/
import java.net.ServerSocket;
--- a/jdk/test/com/sun/jdi/PopAndInvokeTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/PopAndInvokeTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -31,7 +31,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g PopAndInvokeTest.java
- * @run main PopAndInvokeTest
+ * @run driver PopAndInvokeTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/PopAndStepTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/PopAndStepTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -10,7 +10,7 @@
* @library ..
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g PopAndStepTest.java
- * @run main PopAndStepTest
+ * @run driver PopAndStepTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/PopAsynchronousTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/PopAsynchronousTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -31,7 +31,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g PopAsynchronousTest.java
- * @run main PopAsynchronousTest
+ * @run driver PopAsynchronousTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/PopSynchronousTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/PopSynchronousTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -31,7 +31,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g PopSynchronousTest.java
- * @run main PopSynchronousTest
+ * @run driver PopSynchronousTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/RedefineCrossEvent.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/RedefineCrossEvent.java Wed Jul 05 19:46:31 2017 +0200
@@ -46,26 +46,26 @@
* @run compile -g RepStepTarg.java
* @run compile -g RequestReflectionTest.java
*
- * @run main AccessSpecifierTest -redefstart -redefevent
- * @run main AfterThreadDeathTest -redefstart -redefevent
- * @run main ArrayRangeTest -redefstart -redefevent
- * @run main BacktraceFieldTest -redefstart -redefevent
- * @run main ClassesByName2Test -redefstart -redefevent
- * @run main DebuggerThreadTest -redefstart -redefevent
- * @run main DeleteEventRequestsTest -redefstart -redefevent
- * @run main/othervm ExceptionEvents -redefstart -redefevent N A StackOverflowCaughtTarg java.lang.Exception
- * @run main/othervm ExceptionEvents -redefstart -redefevent C A StackOverflowCaughtTarg null
- * @run main/othervm ExceptionEvents -redefstart -redefevent C A StackOverflowCaughtTarg java.lang.StackOverflowError
- * @run main/othervm ExceptionEvents -redefstart -redefevent N A StackOverflowCaughtTarg java.lang.NullPointerException
- * @run main/othervm ExceptionEvents -redefstart -redefevent C T StackOverflowCaughtTarg java.lang.Error
- * @run main/othervm ExceptionEvents -redefstart -redefevent N T StackOverflowCaughtTarg java.lang.NullPointerException
- * @run main/othervm ExceptionEvents -redefstart -redefevent N N StackOverflowCaughtTarg java.lang.Exception
- * @run main/othervm ExceptionEvents -redefstart -redefevent C N StackOverflowCaughtTarg java.lang.Error
- * @run main/othervm ExceptionEvents -redefstart -redefevent N A StackOverflowUncaughtTarg java.lang.Exception
- * @run main ExpiredRequestDeletionTest -redefstart -redefevent
- * @run main/othervm FieldWatchpoints -redefstart -redefevent
- * @run main/othervm InstanceFilter -redefstart -redefevent
- * @run main LocationTest -redefstart -redefevent
- * @run main NewInstanceTest -redefstart -redefevent
- * @run main RequestReflectionTest -redefstart -redefevent
+ * @run driver AccessSpecifierTest -redefstart -redefevent
+ * @run driver AfterThreadDeathTest -redefstart -redefevent
+ * @run driver ArrayRangeTest -redefstart -redefevent
+ * @run driver BacktraceFieldTest -redefstart -redefevent
+ * @run driver ClassesByName2Test -redefstart -redefevent
+ * @run driver DebuggerThreadTest -redefstart -redefevent
+ * @run driver DeleteEventRequestsTest -redefstart -redefevent
+ * @run driver ExceptionEvents -redefstart -redefevent N A StackOverflowCaughtTarg java.lang.Exception
+ * @run driver ExceptionEvents -redefstart -redefevent C A StackOverflowCaughtTarg null
+ * @run driver ExceptionEvents -redefstart -redefevent C A StackOverflowCaughtTarg java.lang.StackOverflowError
+ * @run driver ExceptionEvents -redefstart -redefevent N A StackOverflowCaughtTarg java.lang.NullPointerException
+ * @run driver ExceptionEvents -redefstart -redefevent C T StackOverflowCaughtTarg java.lang.Error
+ * @run driver ExceptionEvents -redefstart -redefevent N T StackOverflowCaughtTarg java.lang.NullPointerException
+ * @run driver ExceptionEvents -redefstart -redefevent N N StackOverflowCaughtTarg java.lang.Exception
+ * @run driver ExceptionEvents -redefstart -redefevent C N StackOverflowCaughtTarg java.lang.Error
+ * @run driver ExceptionEvents -redefstart -redefevent N A StackOverflowUncaughtTarg java.lang.Exception
+ * @run driver ExpiredRequestDeletionTest -redefstart -redefevent
+ * @run driver FieldWatchpoints -redefstart -redefevent
+ * @run driver InstanceFilter -redefstart -redefevent
+ * @run driver LocationTest -redefstart -redefevent
+ * @run driver NewInstanceTest -redefstart -redefevent
+ * @run driver RequestReflectionTest -redefstart -redefevent
*/
--- a/jdk/test/com/sun/jdi/RedefineCrossStart.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/RedefineCrossStart.java Wed Jul 05 19:46:31 2017 +0200
@@ -37,13 +37,13 @@
* @run compile -g FramesTest.java
* @run compile -g InvokeTest.java
*
- * @run main CountEvent -redefstart
- * @run main CountFilterTest -redefstart
- * @run main FramesTest -redefstart
- * @run main InvokeTest -redefstart
+ * @run driver CountEvent -redefstart
+ * @run driver CountFilterTest -redefstart
+ * @run driver FramesTest -redefstart
+ * @run driver InvokeTest -redefstart
*
- * @run main/othervm ExceptionEvents -redefstart U A StackOverflowUncaughtTarg null
- * @run main/othervm ExceptionEvents -redefstart U A StackOverflowUncaughtTarg java.lang.Error
- * @run main/othervm ExceptionEvents -redefstart U A StackOverflowUncaughtTarg java.lang.StackOverflowError
- * @run main PopSynchronousTest -redefstart
+ * @run driver ExceptionEvents -redefstart U A StackOverflowUncaughtTarg null
+ * @run driver ExceptionEvents -redefstart U A StackOverflowUncaughtTarg java.lang.Error
+ * @run driver ExceptionEvents -redefstart U A StackOverflowUncaughtTarg java.lang.StackOverflowError
+ * @run driver PopSynchronousTest -redefstart
*/
--- a/jdk/test/com/sun/jdi/ReferrersTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/ReferrersTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -29,7 +29,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g ReferrersTest.java
- * @run main ReferrersTest
+ * @run driver ReferrersTest
*/
/*
--- a/jdk/test/com/sun/jdi/RepStep.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/RepStep.java Wed Jul 05 19:46:31 2017 +0200
@@ -29,7 +29,7 @@
* @run compile -g RepStepTarg.java
* @run build VMConnection RepStep
*
- * @run main/othervm RepStep
+ * @run driver RepStep
*
* @summary RepStep detects missed step events due to lack of
* frame pop events (in back-end).
--- a/jdk/test/com/sun/jdi/RequestReflectionTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/RequestReflectionTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -28,7 +28,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g RequestReflectionTest.java
- * @run main RequestReflectionTest
+ * @run driver RequestReflectionTest
*
* @summary RequestReflectionTest checks to see that reflective
* accessors on EventRequests return what they are given.
--- a/jdk/test/com/sun/jdi/ResumeOneThreadTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/ResumeOneThreadTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -30,7 +30,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g ResumeOneThreadTest.java
- * @run main ResumeOneThreadTest
+ * @run driver ResumeOneThreadTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/RunToExit.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/RunToExit.java Wed Jul 05 19:46:31 2017 +0200
@@ -26,7 +26,7 @@
* @summary Test that with server=y, when VM runs to System.exit() no error happens
*
* @build VMConnection RunToExit Exit0
- * @run main/othervm RunToExit
+ * @run driver RunToExit
*/
import java.io.InputStream;
import java.io.IOException;
--- a/jdk/test/com/sun/jdi/SDENullTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/SDENullTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -30,7 +30,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g SDENullTest.java
- * @run main SDENullTest
+ * @run driver SDENullTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/SimulResumerTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/SimulResumerTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -30,7 +30,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g SimulResumerTest.java
- * @run main/othervm SimulResumerTest
+ * @run driver SimulResumerTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/SourceNameFilterTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/SourceNameFilterTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -30,9 +30,9 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g SourceNameFilterTest.java
- * @run main SourceNameFilterTest
+ * @run driver SourceNameFilterTest
* @run compile -g:none SourceNameFilterTest.java
- * @run main SourceNameFilterTest
+ * @run driver SourceNameFilterTest
*/
// The compile -g:none suppresses the lineNumber table to trigger bug 6646613.
--- a/jdk/test/com/sun/jdi/StepTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/StepTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -51,15 +51,15 @@
* | | | +--- Debuggee command Line
* V V V V Workaround-----+
* V
- * @run main StepTest 2 line 2 MethodCalls
- * @run main StepTest 3 line 14 MethodCalls
+ * @run driver StepTest 2 line 2 MethodCalls
+ * @run driver StepTest 3 line 14 MethodCalls
*
- * @run main StepTest 2 line 18 MethodCallsReflection 12
+ * @run driver StepTest 2 line 18 MethodCallsReflection 12
*
- * @run main StepTest 2 min 4 MethodCalls
- * @run main StepTest 3 min 43 MethodCalls
+ * @run driver StepTest 2 min 4 MethodCalls
+ * @run driver StepTest 3 min 43 MethodCalls
*
- * @run main StepTest 2 line 65 ControlFlow 64
+ * @run driver StepTest 2 line 65 ControlFlow 64
*/
/*
--- a/jdk/test/com/sun/jdi/SuspendThreadTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/SuspendThreadTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -30,7 +30,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g SuspendThreadTest.java
- * @run main SuspendThreadTest
+ * @run driver SuspendThreadTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/TemplateTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/TemplateTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -33,7 +33,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g TemplateTest.java
- * @run main TemplateTest
+ * @run driver TemplateTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/ThreadGroupTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/ThreadGroupTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -30,7 +30,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile ThreadGroupTest.java
- * @run main ThreadGroupTest
+ * @run driver ThreadGroupTest
*/
import com.sun.jdi.*;
import com.sun.jdi.connect.*;
--- a/jdk/test/com/sun/jdi/TwoThreadsTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/TwoThreadsTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -30,7 +30,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g TwoThreadsTest.java
- * @run main TwoThreadsTest
+ * @run driver TwoThreadsTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/UTF8Test.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/UTF8Test.java Wed Jul 05 19:46:31 2017 +0200
@@ -30,7 +30,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g UTF8Test.java
- * @run main UTF8Test
+ * @run driver UTF8Test
*/
/*
--- a/jdk/test/com/sun/jdi/UnpreparedByName.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/UnpreparedByName.java Wed Jul 05 19:46:31 2017 +0200
@@ -33,7 +33,7 @@
* @run compile -g InnerTarg.java
* @run build UnpreparedByName
*
- * @run main UnpreparedByName InnerTarg
+ * @run driver UnpreparedByName InnerTarg
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/UnpreparedClasses.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/UnpreparedClasses.java Wed Jul 05 19:46:31 2017 +0200
@@ -33,7 +33,7 @@
* @run compile -g InnerTarg.java
* @run build UnpreparedClasses
*
- * @run main UnpreparedClasses InnerTarg
+ * @run driver UnpreparedClasses InnerTarg
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/VMConnection.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/VMConnection.java Wed Jul 05 19:46:31 2017 +0200
@@ -52,61 +52,23 @@
// When we run under jtreg, test.classes contains the pathname of
// the dir in which the .class files will be placed.
- BufferedReader reader;
String testClasses = System.getProperty("test.classes");
if (testClasses == null) {
return retVal;
}
- retVal += "-classpath " + testClasses + " ";
- File myFile = new File(testClasses, "@debuggeeVMOptions");
+ retVal += "-classpath " + testClasses;
- if (!myFile.canRead()) {
- // Not there - look in parent (in case we are in a subdir)
- myFile = new File(testClasses);
- String parentDir = myFile.getParent();
- if (parentDir != null) {
- myFile = new File(parentDir, "@debuggeeVMOptions");
- if (!myFile.canRead()) {
- return retVal;
- }
- }
+ String vmOpts = System.getProperty("test.vm.opts");
+ System.out.println("vmOpts: "+vmOpts);
+ if (vmOpts != null) {
+ retVal += " " + vmOpts;
}
- String wholePath = myFile.getPath();
- try {
- reader = new BufferedReader(new FileReader(myFile));
- } catch (FileNotFoundException ee) {
- System.out.println("-- Error 2 trying to access file " +
- wholePath + ": " + ee);
- return retVal;
+ String javaOpts = System.getProperty("test.java.opts");
+ System.out.println("javaOpts: "+javaOpts);
+ if (javaOpts != null) {
+ retVal += " " + javaOpts;
}
- String line;
- while (true) {
- try {
- line = reader.readLine();
- } catch (IOException ee) {
- System.out.println("-- Error reading options from file " +
- wholePath + ": " + ee);
- break;
- }
- if (line == null) {
- System.out.println("-- No debuggee VM options found in file " +
- wholePath);
- break;
- }
- line = line.trim();
- if (line.length() != 0 && !line.startsWith("#")) {
- System.out.println("-- Added debuggeeVM options from file " +
- wholePath + ": " + line);
- retVal += line;
- break;
- }
- // Else, read he next line.
- }
- try {
- reader.close();
- } catch (IOException ee) {
- }
return retVal;
}
--- a/jdk/test/com/sun/jdi/VMDeathLastTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/VMDeathLastTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -31,7 +31,7 @@
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g HelloWorld.java
* @run build VMDeathLastTest
- * @run main VMDeathLastTest
+ * @run driver VMDeathLastTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/VMDeathRequestTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/VMDeathRequestTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -29,7 +29,7 @@
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g HelloWorld.java
* @run build VMDeathRequestTest
- * @run main VMDeathRequestTest
+ * @run driver VMDeathRequestTest
*
* @summary VMDeathRequestTest checks to see that
* VMDisconnectedException is never thrown before VMDisconnectEvent.
--- a/jdk/test/com/sun/jdi/VarargsTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/VarargsTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -30,7 +30,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g VarargsTest.java
- * @run main VarargsTest
+ * @run driver VarargsTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/Vars.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/Vars.java Wed Jul 05 19:46:31 2017 +0200
@@ -30,7 +30,7 @@
* @library scaffold
* @run build JDIScaffold VMConnection
* @run compile -g Vars.java
- * @run main/othervm Vars
+ * @run driver Vars
*/
import com.sun.jdi.*;
--- a/jdk/test/com/sun/jdi/VisibleMethods.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/VisibleMethods.java Wed Jul 05 19:46:31 2017 +0200
@@ -30,7 +30,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g VisibleMethods.java
- * @run main VisibleMethods
+ * @run driver VisibleMethods
*/
import com.sun.jdi.Method;
import com.sun.jdi.ReferenceType;
--- a/jdk/test/com/sun/jdi/redefine/RedefineTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/redefine/RedefineTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -34,7 +34,7 @@
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g RedefineTest.java
* @run shell RedefineSetUp.sh
- * @run main/othervm RedefineTest
+ * @run driver RedefineTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/redefineMethod/RedefineTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/redefineMethod/RedefineTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -32,8 +32,8 @@
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g RedefineTest.java
* @run shell RedefineSetUp.sh
- * @run main RedefineTest -repeat 3
- * @run main RedefineTest
+ * @run driver RedefineTest -repeat 3
+ * @run driver RedefineTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/sde/FilterMangleTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/sde/FilterMangleTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -9,21 +9,21 @@
* @run build TestScaffold VMConnection TargetListener TargetAdapter InstallSDE
* @run compile FilterMangleTest.java
* @run compile -g onion/pickle/Mangle.java
- * @run main FilterMangleTest
- * @run main FilterMangleTest SDE-pMangle.java*
- * @run main FilterMangleTest SDE-pMangle.jav*
- * @run main FilterMangleTest SDE-pMangle.j*
- * @run main FilterMangleTest SDE-p*Mangle.java
- * @run main FilterMangleTest SDE-p*angle.java
- * @run main FilterMangleTest SDE-p*java
- * @run main FilterMangleTest SDE-pMangle.xyz
- * @run main FilterMangleTest SDE-pIncl.rats*
- * @run main FilterMangleTest SDE-pIncl.rat*
- * @run main FilterMangleTest SDE-p*angle.rats
- * @run main FilterMangleTest SDE-f*Incl.rat
- * @run main FilterMangleTest SDE-ffred
- * @run main FilterMangleTest SDE-f*ratsx
- * @run main FilterMangleTest SDE-fMangle.javax*
+ * @run driver FilterMangleTest
+ * @run driver FilterMangleTest SDE-pMangle.java*
+ * @run driver FilterMangleTest SDE-pMangle.jav*
+ * @run driver FilterMangleTest SDE-pMangle.j*
+ * @run driver FilterMangleTest SDE-p*Mangle.java
+ * @run driver FilterMangleTest SDE-p*angle.java
+ * @run driver FilterMangleTest SDE-p*java
+ * @run driver FilterMangleTest SDE-pMangle.xyz
+ * @run driver FilterMangleTest SDE-pIncl.rats*
+ * @run driver FilterMangleTest SDE-pIncl.rat*
+ * @run driver FilterMangleTest SDE-p*angle.rats
+ * @run driver FilterMangleTest SDE-f*Incl.rat
+ * @run driver FilterMangleTest SDE-ffred
+ * @run driver FilterMangleTest SDE-f*ratsx
+ * @run driver FilterMangleTest SDE-fMangle.javax*
*/
/*
--- a/jdk/test/com/sun/jdi/sde/MangleStepTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/sde/MangleStepTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -10,11 +10,11 @@
* @run build TestScaffold VMConnection TargetListener TargetAdapter InstallSDE
* @run compile MangleStepTest.java
* @run compile -g onion/pickle/Mangle.java
- * @run main/othervm MangleStepTest unset
- * @run main/othervm MangleStepTest Java
- * @run main/othervm MangleStepTest XYZ
- * @run main/othervm MangleStepTest Rats
- * @run main/othervm MangleStepTest bogus
+ * @run driver MangleStepTest unset
+ * @run driver MangleStepTest Java
+ * @run driver MangleStepTest XYZ
+ * @run driver MangleStepTest Rats
+ * @run driver MangleStepTest bogus
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
@@ -82,7 +82,6 @@
}
BreakpointEvent bpe = resumeTo(targetName, "main",
"([Ljava/lang/String;)V");
- waitForInput();
ThreadReference thread = bpe.thread();
--- a/jdk/test/com/sun/jdi/sde/MangleTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/sde/MangleTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -10,7 +10,7 @@
* @run build TestScaffold VMConnection TargetListener TargetAdapter InstallSDE
* @run compile MangleTest.java
* @run compile -g onion/pickle/Mangle.java
- * @run main MangleTest
+ * @run driver MangleTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/sde/SourceDebugExtensionTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/sde/SourceDebugExtensionTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -10,7 +10,7 @@
* @run build TestScaffold VMConnection TargetListener TargetAdapter InstallSDE
* @run compile SourceDebugExtensionTest.java
* @run compile -g SourceDebugExtensionTarg.java
- * @run main SourceDebugExtensionTest
+ * @run driver SourceDebugExtensionTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/sde/TemperatureTableTest.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/jdi/sde/TemperatureTableTest.java Wed Jul 05 19:46:31 2017 +0200
@@ -10,7 +10,7 @@
* @run build TestScaffold VMConnection TargetListener TargetAdapter InstallSDE HelloWorld
* @run compile TemperatureTableTest.java
* @run compile -g TemperatureTableServlet.java
- * @run main TemperatureTableTest
+ * @run driver TemperatureTableTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/tools/attach/StartManagementAgent.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/com/sun/tools/attach/StartManagementAgent.java Wed Jul 05 19:46:31 2017 +0200
@@ -93,7 +93,7 @@
} catch(AttachOperationFailedException ex) {
// We expect parsing of "apa" above to fail, but if the file path
// can't be read we get a different exception message
- if (!ex.getMessage().contains("java.lang.NumberFormatException")) {
+ if (!ex.getMessage().contains("Invalid com.sun.management.jmxremote.port number")) {
throw ex;
}
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/invoke/VMAnonymousClass.java Wed Jul 05 19:46:31 2017 +0200
@@ -0,0 +1,118 @@
+/*
+ * 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 8046903
+ * @summary VM anonymous class members can't be statically invocable
+ * @run junit test.java.lang.invoke.VMAnonymousClass
+ */
+package test.java.lang.invoke;
+
+import java.lang.invoke.MethodHandle;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.MethodType;
+import java.lang.reflect.Field;
+import org.junit.Test;
+import sun.misc.Unsafe;
+import jdk.internal.org.objectweb.asm.*;
+import static jdk.internal.org.objectweb.asm.Opcodes.*;
+
+public class VMAnonymousClass {
+ public static void main(String[] args) throws Throwable {
+ VMAnonymousClass test = new VMAnonymousClass();
+ test.testJavaLang();
+ test.testJavaUtil();
+ test.testSunMisc();
+ test.testJavaLangInvoke();
+ System.out.println("TEST PASSED");
+ }
+
+ // Test VM anonymous classes from different packages
+ // (see j.l.i.InvokerBytecodeGenerator::isStaticallyInvocable).
+ @Test public void testJavaLang() throws Throwable { test("java/lang"); }
+ @Test public void testJavaUtil() throws Throwable { test("java/util"); }
+ @Test public void testSunMisc() throws Throwable { test("sun/misc"); }
+ @Test public void testJavaLangInvoke() throws Throwable { test("java/lang/invoke"); }
+
+ private static Unsafe unsafe = getUnsafe();
+
+ private static void test(String pkg) throws Throwable {
+ byte[] bytes = dumpClass(pkg);
+ // Define VM anonymous class in privileged context (on BCP).
+ Class anonClass = unsafe.defineAnonymousClass(Object.class, bytes, null);
+
+ MethodType t = MethodType.methodType(Object.class, int.class);
+ MethodHandle target = MethodHandles.lookup().findStatic(anonClass, "get", t);
+
+ // Wrap target into LF (convert) to get "target" referenced from LF
+ MethodHandle wrappedMH = target.asType(MethodType.methodType(Object.class, Integer.class));
+
+ // Invoke enough times to provoke LF compilation to bytecode.
+ for (int i = 0; i<100; i++) {
+ Object r = wrappedMH.invokeExact((Integer)1);
+ }
+ }
+
+ /*
+ * Constructs bytecode for the following class:
+ * public class pkg.MyClass {
+ * MyClass() {}
+ * public Object get(int i) { return null; }
+ * }
+ */
+ public static byte[] dumpClass(String pkg) {
+ ClassWriter cw = new ClassWriter(0);
+ MethodVisitor mv;
+
+ cw.visit(52, ACC_SUPER | ACC_PUBLIC, pkg+"/MyClass", null, "java/lang/Object", null);
+ {
+ mv = cw.visitMethod(0, "<init>", "()V", null, null);
+ mv.visitCode();
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
+ mv.visitInsn(RETURN);
+ mv.visitMaxs(1, 1);
+ mv.visitEnd();
+ }
+ {
+ mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "get", "(I)Ljava/lang/Object;", null, null);
+ mv.visitCode();
+ mv.visitInsn(ACONST_NULL);
+ mv.visitInsn(ARETURN);
+ mv.visitMaxs(1, 1);
+ mv.visitEnd();
+ }
+ cw.visitEnd();
+ return cw.toByteArray();
+ }
+
+ private static synchronized Unsafe getUnsafe() {
+ try {
+ Field f = Unsafe.class.getDeclaredField("theUnsafe");
+ f.setAccessible(true);
+ return (Unsafe) f.get(null);
+ } catch (NoSuchFieldException | IllegalAccessException e) {
+ throw new RuntimeException("Unable to get Unsafe instance.", e);
+ }
+ }
+}
--- a/jdk/test/java/time/tck/java/time/format/TCKDateTimeParseResolver.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/java/time/tck/java/time/format/TCKDateTimeParseResolver.java Wed Jul 05 19:46:31 2017 +0200
@@ -76,6 +76,7 @@
import static java.time.temporal.ChronoField.ERA;
import static java.time.temporal.ChronoField.HOUR_OF_AMPM;
import static java.time.temporal.ChronoField.HOUR_OF_DAY;
+import static java.time.temporal.ChronoField.INSTANT_SECONDS;
import static java.time.temporal.ChronoField.MICRO_OF_DAY;
import static java.time.temporal.ChronoField.MICRO_OF_SECOND;
import static java.time.temporal.ChronoField.MILLI_OF_DAY;
@@ -93,11 +94,13 @@
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.fail;
+import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.Period;
import java.time.ZoneId;
+import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.chrono.ChronoLocalDate;
import java.time.chrono.ChronoLocalDateTime;
@@ -1159,4 +1162,102 @@
}
};
+ //-------------------------------------------------------------------------
+ // SPEC: ChronoField.INSTANT_SECONDS
+ @Test
+ public void test_parse_fromField_InstantSeconds() {
+ DateTimeFormatter fmt = new DateTimeFormatterBuilder()
+ .appendValue(INSTANT_SECONDS).toFormatter();
+ TemporalAccessor acc = fmt.parse("86402");
+ Instant expected = Instant.ofEpochSecond(86402);
+ assertEquals(acc.isSupported(INSTANT_SECONDS), true);
+ assertEquals(acc.isSupported(NANO_OF_SECOND), true);
+ assertEquals(acc.isSupported(MICRO_OF_SECOND), true);
+ assertEquals(acc.isSupported(MILLI_OF_SECOND), true);
+ assertEquals(acc.getLong(INSTANT_SECONDS), 86402L);
+ assertEquals(acc.getLong(NANO_OF_SECOND), 0L);
+ assertEquals(acc.getLong(MICRO_OF_SECOND), 0L);
+ assertEquals(acc.getLong(MILLI_OF_SECOND), 0L);
+ assertEquals(Instant.from(acc), expected);
+ }
+
+ @Test
+ public void test_parse_fromField_InstantSeconds_NanoOfSecond() {
+ DateTimeFormatter fmt = new DateTimeFormatterBuilder()
+ .appendValue(INSTANT_SECONDS).appendLiteral('.').appendValue(NANO_OF_SECOND).toFormatter();
+ TemporalAccessor acc = fmt.parse("86402.123456789");
+ Instant expected = Instant.ofEpochSecond(86402, 123456789);
+ assertEquals(acc.isSupported(INSTANT_SECONDS), true);
+ assertEquals(acc.isSupported(NANO_OF_SECOND), true);
+ assertEquals(acc.isSupported(MICRO_OF_SECOND), true);
+ assertEquals(acc.isSupported(MILLI_OF_SECOND), true);
+ assertEquals(acc.getLong(INSTANT_SECONDS), 86402L);
+ assertEquals(acc.getLong(NANO_OF_SECOND), 123456789L);
+ assertEquals(acc.getLong(MICRO_OF_SECOND), 123456L);
+ assertEquals(acc.getLong(MILLI_OF_SECOND), 123L);
+ assertEquals(Instant.from(acc), expected);
+ }
+
+ // SPEC: ChronoField.SECOND_OF_DAY
+ @Test
+ public void test_parse_fromField_SecondOfDay() {
+ DateTimeFormatter fmt = new DateTimeFormatterBuilder()
+ .appendValue(SECOND_OF_DAY).toFormatter();
+ TemporalAccessor acc = fmt.parse("864");
+ assertEquals(acc.isSupported(SECOND_OF_DAY), true);
+ assertEquals(acc.isSupported(NANO_OF_SECOND), true);
+ assertEquals(acc.isSupported(MICRO_OF_SECOND), true);
+ assertEquals(acc.isSupported(MILLI_OF_SECOND), true);
+ assertEquals(acc.getLong(SECOND_OF_DAY), 864L);
+ assertEquals(acc.getLong(NANO_OF_SECOND), 0L);
+ assertEquals(acc.getLong(MICRO_OF_SECOND), 0L);
+ assertEquals(acc.getLong(MILLI_OF_SECOND), 0L);
+ }
+
+ @Test
+ public void test_parse_fromField_SecondOfDay_NanoOfSecond() {
+ DateTimeFormatter fmt = new DateTimeFormatterBuilder()
+ .appendValue(SECOND_OF_DAY).appendLiteral('.').appendValue(NANO_OF_SECOND).toFormatter();
+ TemporalAccessor acc = fmt.parse("864.123456789");
+ assertEquals(acc.isSupported(SECOND_OF_DAY), true);
+ assertEquals(acc.isSupported(NANO_OF_SECOND), true);
+ assertEquals(acc.isSupported(MICRO_OF_SECOND), true);
+ assertEquals(acc.isSupported(MILLI_OF_SECOND), true);
+ assertEquals(acc.getLong(SECOND_OF_DAY), 864L);
+ assertEquals(acc.getLong(NANO_OF_SECOND), 123456789L);
+ assertEquals(acc.getLong(MICRO_OF_SECOND), 123456L);
+ assertEquals(acc.getLong(MILLI_OF_SECOND), 123L);
+ }
+
+ // SPEC: ChronoField.SECOND_OF_MINUTE
+ @Test
+ public void test_parse_fromField_SecondOfMinute() {
+ DateTimeFormatter fmt = new DateTimeFormatterBuilder()
+ .appendValue(SECOND_OF_MINUTE).toFormatter();
+ TemporalAccessor acc = fmt.parse("32");
+ assertEquals(acc.isSupported(SECOND_OF_MINUTE), true);
+ assertEquals(acc.isSupported(NANO_OF_SECOND), true);
+ assertEquals(acc.isSupported(MICRO_OF_SECOND), true);
+ assertEquals(acc.isSupported(MILLI_OF_SECOND), true);
+ assertEquals(acc.getLong(SECOND_OF_MINUTE), 32L);
+ assertEquals(acc.getLong(NANO_OF_SECOND), 0L);
+ assertEquals(acc.getLong(MICRO_OF_SECOND), 0L);
+ assertEquals(acc.getLong(MILLI_OF_SECOND), 0L);
+ }
+
+ @Test
+ public void test_parse_fromField_SecondOfMinute_NanoOfSecond() {
+ DateTimeFormatter fmt = new DateTimeFormatterBuilder()
+ .appendValue(SECOND_OF_MINUTE).appendLiteral('.').appendValue(NANO_OF_SECOND).toFormatter();
+ TemporalAccessor acc = fmt.parse("32.123456789");
+ assertEquals(acc.isSupported(SECOND_OF_MINUTE), true);
+ assertEquals(acc.isSupported(NANO_OF_SECOND), true);
+ assertEquals(acc.isSupported(MICRO_OF_SECOND), true);
+ assertEquals(acc.isSupported(MILLI_OF_SECOND), true);
+ assertEquals(acc.getLong(SECOND_OF_MINUTE), 32L);
+ assertEquals(acc.getLong(NANO_OF_SECOND), 123456789L);
+ assertEquals(acc.getLong(MICRO_OF_SECOND), 123456L);
+ assertEquals(acc.getLong(MILLI_OF_SECOND), 123L);
+ }
+
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/time/test/java/time/format/TestDateTimeParsing.java Wed Jul 05 19:46:31 2017 +0200
@@ -0,0 +1,204 @@
+/*
+ * 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.
+ */
+
+/*
+ * This file is available under and governed by the GNU General Public
+ * License version 2 only, as published by the Free Software Foundation.
+ * However, the following notice accompanied the original version of this
+ * file:
+ *
+ * Copyright (c) 2014, Stephen Colebourne & Michael Nascimento Santos
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * * Neither the name of JSR-310 nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package test.java.time.format;
+
+import static java.time.temporal.ChronoField.EPOCH_DAY;
+import static java.time.temporal.ChronoField.INSTANT_SECONDS;
+import static java.time.temporal.ChronoField.MICRO_OF_SECOND;
+import static java.time.temporal.ChronoField.MILLI_OF_SECOND;
+import static java.time.temporal.ChronoField.NANO_OF_SECOND;
+import static java.time.temporal.ChronoField.OFFSET_SECONDS;
+import static java.time.temporal.ChronoField.SECOND_OF_DAY;
+import static org.testng.Assert.assertEquals;
+
+import java.time.DateTimeException;
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.ZoneOffset;
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeFormatterBuilder;
+import java.time.temporal.TemporalAccessor;
+
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+/**
+ * Test parsing of edge cases.
+ */
+@Test
+public class TestDateTimeParsing {
+
+ private static final ZoneId PARIS = ZoneId.of("Europe/Paris");
+ private static final ZoneOffset OFFSET_0230 = ZoneOffset.ofHoursMinutes(2, 30);
+
+ private static final DateTimeFormatter LOCALFIELDS = new DateTimeFormatterBuilder()
+ .appendPattern("yyyy-MM-dd HH:mm:ss").toFormatter();
+ private static final DateTimeFormatter LOCALFIELDS_ZONEID = new DateTimeFormatterBuilder()
+ .appendPattern("yyyy-MM-dd HH:mm:ss ").appendZoneId().toFormatter();
+ private static final DateTimeFormatter LOCALFIELDS_OFFSETID = new DateTimeFormatterBuilder()
+ .appendPattern("yyyy-MM-dd HH:mm:ss ").appendOffsetId().toFormatter();
+ private static final DateTimeFormatter LOCALFIELDS_WITH_PARIS = LOCALFIELDS.withZone(PARIS);
+ private static final DateTimeFormatter LOCALFIELDS_WITH_0230 = LOCALFIELDS.withZone(OFFSET_0230);
+ private static final DateTimeFormatter INSTANT = new DateTimeFormatterBuilder()
+ .appendInstant().toFormatter();
+ private static final DateTimeFormatter INSTANT_WITH_PARIS = INSTANT.withZone(PARIS);
+ private static final DateTimeFormatter INSTANT_WITH_0230 = INSTANT.withZone(OFFSET_0230);
+ private static final DateTimeFormatter INSTANT_OFFSETID = new DateTimeFormatterBuilder()
+ .appendInstant().appendLiteral(' ').appendOffsetId().toFormatter();
+ private static final DateTimeFormatter INSTANT_OFFSETSECONDS = new DateTimeFormatterBuilder()
+ .appendInstant().appendLiteral(' ').appendValue(OFFSET_SECONDS).toFormatter();
+ private static final DateTimeFormatter INSTANTSECONDS = new DateTimeFormatterBuilder()
+ .appendValue(INSTANT_SECONDS).toFormatter();
+ private static final DateTimeFormatter INSTANTSECONDS_WITH_PARIS = INSTANTSECONDS.withZone(PARIS);
+ private static final DateTimeFormatter INSTANTSECONDS_NOS = new DateTimeFormatterBuilder()
+ .appendValue(INSTANT_SECONDS).appendLiteral('.').appendValue(NANO_OF_SECOND).toFormatter();
+ private static final DateTimeFormatter INSTANTSECONDS_NOS_WITH_PARIS = INSTANTSECONDS_NOS.withZone(PARIS);
+ private static final DateTimeFormatter INSTANTSECONDS_OFFSETSECONDS = new DateTimeFormatterBuilder()
+ .appendValue(INSTANT_SECONDS).appendLiteral(' ').appendValue(OFFSET_SECONDS).toFormatter();
+
+ @DataProvider(name = "instantZones")
+ Object[][] data_instantZones() {
+ return new Object[][] {
+ {LOCALFIELDS_ZONEID, "2014-06-30 01:02:03 Europe/Paris", ZonedDateTime.of(2014, 6, 30, 1, 2, 3, 0, PARIS)},
+ {LOCALFIELDS_ZONEID, "2014-06-30 01:02:03 +02:30", ZonedDateTime.of(2014, 6, 30, 1, 2, 3, 0, OFFSET_0230)},
+ {LOCALFIELDS_OFFSETID, "2014-06-30 01:02:03 +02:30", ZonedDateTime.of(2014, 6, 30, 1, 2, 3, 0, OFFSET_0230)},
+ {LOCALFIELDS_WITH_PARIS, "2014-06-30 01:02:03", ZonedDateTime.of(2014, 6, 30, 1, 2, 3, 0, PARIS)},
+ {LOCALFIELDS_WITH_0230, "2014-06-30 01:02:03", ZonedDateTime.of(2014, 6, 30, 1, 2, 3, 0, OFFSET_0230)},
+ {INSTANT_WITH_PARIS, "2014-06-30T01:02:03Z", ZonedDateTime.of(2014, 6, 30, 1, 2, 3, 0, ZoneOffset.UTC).withZoneSameInstant(PARIS)},
+ {INSTANT_WITH_0230, "2014-06-30T01:02:03Z", ZonedDateTime.of(2014, 6, 30, 1, 2, 3, 0, ZoneOffset.UTC).withZoneSameInstant(OFFSET_0230)},
+ {INSTANT_OFFSETID, "2014-06-30T01:02:03Z +02:30", ZonedDateTime.of(2014, 6, 30, 1, 2, 3, 0, ZoneOffset.UTC).withZoneSameInstant(OFFSET_0230)},
+ {INSTANT_OFFSETSECONDS, "2014-06-30T01:02:03Z 9000", ZonedDateTime.of(2014, 6, 30, 1, 2, 3, 0, ZoneOffset.UTC).withZoneSameInstant(OFFSET_0230)},
+ {INSTANTSECONDS_WITH_PARIS, "86402", Instant.ofEpochSecond(86402).atZone(PARIS)},
+ {INSTANTSECONDS_NOS_WITH_PARIS, "86402.123456789", Instant.ofEpochSecond(86402, 123456789).atZone(PARIS)},
+ {INSTANTSECONDS_OFFSETSECONDS, "86402 9000", Instant.ofEpochSecond(86402).atZone(OFFSET_0230)},
+ };
+ }
+
+ @Test(dataProvider = "instantZones")
+ public void test_parse_instantZones_ZDT(DateTimeFormatter formatter, String text, ZonedDateTime expected) {
+ TemporalAccessor actual = formatter.parse(text);
+ assertEquals(ZonedDateTime.from(actual), expected);
+ }
+
+ @Test(dataProvider = "instantZones")
+ public void test_parse_instantZones_LDT(DateTimeFormatter formatter, String text, ZonedDateTime expected) {
+ TemporalAccessor actual = formatter.parse(text);
+ assertEquals(LocalDateTime.from(actual), expected.toLocalDateTime());
+ }
+
+ @Test(dataProvider = "instantZones")
+ public void test_parse_instantZones_Instant(DateTimeFormatter formatter, String text, ZonedDateTime expected) {
+ TemporalAccessor actual = formatter.parse(text);
+ assertEquals(Instant.from(actual), expected.toInstant());
+ }
+
+ @Test(dataProvider = "instantZones")
+ public void test_parse_instantZones_supported(DateTimeFormatter formatter, String text, ZonedDateTime expected) {
+ TemporalAccessor actual = formatter.parse(text);
+ assertEquals(actual.isSupported(INSTANT_SECONDS), true);
+ assertEquals(actual.isSupported(EPOCH_DAY), true);
+ assertEquals(actual.isSupported(SECOND_OF_DAY), true);
+ assertEquals(actual.isSupported(NANO_OF_SECOND), true);
+ assertEquals(actual.isSupported(MICRO_OF_SECOND), true);
+ assertEquals(actual.isSupported(MILLI_OF_SECOND), true);
+ }
+
+ //-----------------------------------------------------------------------
+ @DataProvider(name = "instantNoZone")
+ Object[][] data_instantNoZone() {
+ return new Object[][] {
+ {INSTANT, "2014-06-30T01:02:03Z", ZonedDateTime.of(2014, 6, 30, 1, 2, 3, 0, ZoneOffset.UTC).toInstant()},
+ {INSTANTSECONDS, "86402", Instant.ofEpochSecond(86402)},
+ {INSTANTSECONDS_NOS, "86402.123456789", Instant.ofEpochSecond(86402, 123456789)},
+ };
+ }
+
+ @Test(dataProvider = "instantNoZone", expectedExceptions = DateTimeException.class)
+ public void test_parse_instantNoZone_ZDT(DateTimeFormatter formatter, String text, Instant expected) {
+ TemporalAccessor actual = formatter.parse(text);
+ ZonedDateTime.from(actual);
+ }
+
+ @Test(dataProvider = "instantNoZone", expectedExceptions = DateTimeException.class)
+ public void test_parse_instantNoZone_LDT(DateTimeFormatter formatter, String text, Instant expected) {
+ TemporalAccessor actual = formatter.parse(text);
+ LocalDateTime.from(actual);
+ }
+
+ @Test(dataProvider = "instantNoZone")
+ public void test_parse_instantNoZone_Instant(DateTimeFormatter formatter, String text, Instant expected) {
+ TemporalAccessor actual = formatter.parse(text);
+ assertEquals(Instant.from(actual), expected);
+ }
+
+ @Test(dataProvider = "instantNoZone")
+ public void test_parse_instantNoZone_supported(DateTimeFormatter formatter, String text, Instant expected) {
+ TemporalAccessor actual = formatter.parse(text);
+ assertEquals(actual.isSupported(INSTANT_SECONDS), true);
+ assertEquals(actual.isSupported(EPOCH_DAY), false);
+ assertEquals(actual.isSupported(SECOND_OF_DAY), false);
+ assertEquals(actual.isSupported(NANO_OF_SECOND), true);
+ assertEquals(actual.isSupported(MICRO_OF_SECOND), true);
+ assertEquals(actual.isSupported(MILLI_OF_SECOND), true);
+ }
+
+}
--- a/jdk/test/jdk/net/Sockets/Test.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/jdk/net/Sockets/Test.java Wed Jul 05 19:46:31 2017 +0200
@@ -30,8 +30,10 @@
*/
import java.net.*;
+import java.io.IOException;
import java.nio.channels.*;
import java.util.concurrent.*;
+import java.util.Set;
import jdk.net.*;
public class Test {
@@ -75,6 +77,13 @@
DatagramSocket dg = new DatagramSocket(0);
final int udp_port = dg.getLocalPort();
+ // If option not available, end test
+ Set<SocketOption<?>> options = dg.supportedOptions();
+ if (!options.contains(ExtendedSocketOptions.SO_FLOW_SLA)) {
+ System.out.println("SO_FLOW_SLA not supported");
+ return;
+ }
+
final Socket s = new Socket("127.0.0.1", tcp_port);
final SocketChannel sc = SocketChannel.open();
sc.connect (new InetSocketAddress("127.0.0.1", tcp_port));
@@ -125,6 +134,13 @@
if (success) {
throw new RuntimeException("Test failed");
}
- } catch (UnsupportedOperationException e) {}
+ } catch (UnsupportedOperationException e) {
+ System.out.println (e);
+ } catch (IOException e) {
+ // Probably a permission error, but we're not
+ // going to check unless a specific permission exception
+ // is defined.
+ System.out.println (e);
+ }
}
}
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/freebl3.chk has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/freebl3.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/libnspr4.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/libnspr4.lib has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/libplc4.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/libplc4.lib has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/libplds4.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/libplds4.lib has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/nss3.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/nss3.lib has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/nssckbi.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/nssdbm3.chk has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/nssdbm3.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/nssutil3.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/nssutil3.lib has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/softokn3.chk has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/softokn3.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/sqlite3.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/ssl3.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/ssl3.lib has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/freebl3.chk has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/freebl3.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/libnspr4.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/libnspr4.lib has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/libplc4.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/libplc4.lib has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/libplds4.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/libplds4.lib has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/nss3.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/nss3.lib has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/nssckbi.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/nssdbm3.chk has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/nssdbm3.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/nssutil3.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/nssutil3.lib has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/softokn3.chk has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/softokn3.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/sqlite3.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/ssl3.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/ssl3.lib has changed
--- a/jdk/test/sun/security/pkcs11/nss/src/MD5SUMS Thu Jun 19 11:22:36 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-1390c8a35c667e05e542 nss-3.13.1.tar.gz
--- a/jdk/test/sun/security/pkcs11/nss/src/SHA1SUMS Thu Jun 19 11:22:36 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-d8e7ee9f9f1e0bfa2ea8b72d25727634fea130a6 nss-3.13.1.tar.gz
Binary file jdk/test/sun/security/pkcs11/nss/src/nss-3.13.1.tar.gz has changed
Binary file jdk/test/sun/security/pkcs11/nss/src/nss-3.16_nspr-4.10_src.tar.gz has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/pkcs11/nss/src/nss-3.16_nspr-4.10_src.tar.gz.sha256 Wed Jul 05 19:46:31 2017 +0200
@@ -0,0 +1,1 @@
+d2374795528f9cf36de07bf7c77d8c8414bb5b4da12ee7c78a57ec90d68e3706 nss-3.16_nspr-4.10_src.tar.gz
--- a/jdk/test/sun/tools/jhat/HatHeapDump1Test.java Thu Jun 19 11:22:36 2014 -0700
+++ b/jdk/test/sun/tools/jhat/HatHeapDump1Test.java Wed Jul 05 19:46:31 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2007, 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
@@ -21,31 +21,68 @@
* questions.
*/
+import java.io.File;
+import java.util.Arrays;
-/* @test HatHeapDump1Test.java
+import jdk.testlibrary.Asserts;
+import jdk.testlibrary.JDKToolLauncher;
+import jdk.testlibrary.OutputAnalyzer;
+import jdk.testlibrary.ProcessTools;
+
+/* @test
* @bug 5102009
- * @summary Test jhat
- *
- * @compile -g HelloWorld.java HatRun.java
- * @build HatHeapDump1Test
- * @run main HatHeapDump1Test HelloWorld
+ * @summary Sanity test of jhat functionality
+ * @library /lib/testlibrary
+ * @build jdk.testlibarary.*
+ * @compile -g HelloWorld.java
+ * @run main HatHeapDump1Test
*/
+public class HatHeapDump1Test {
-public class HatHeapDump1Test {
+ private static final String TEST_CLASSES = System.getProperty("test.classes", ".");
public static void main(String args[]) throws Exception {
- HatRun run;
+ String className = "HelloWorld";
+ File dumpFile = new File(className + ".hdump");
+
+ // Generate a heap dump
+ ProcessBuilder processBuilder = ProcessTools.createJavaProcessBuilder("-cp",
+ TEST_CLASSES,
+ "-Xcheck:jni",
+ "-Xverify:all",
+ "-agentlib:hprof=heap=dump,format=b,file=" + dumpFile.getAbsolutePath(),
+ className);
+ OutputAnalyzer output = new OutputAnalyzer(processBuilder.start());
+ System.out.println(output.getOutput());
+ output.shouldHaveExitValue(0);
+ output.shouldContain("Dumping Java heap ... done");
+ Asserts.assertTrue(dumpFile.exists() && dumpFile.isFile(), "Invalid dump file " + dumpFile.getAbsolutePath());
- /* Run hprof and jhat */
- run = new HatRun("heap=dump", "");
- run.runit(args[0]);
+ // Run jhat to analyze the heap dump
+ output = jhat("-debug", "2", dumpFile.getAbsolutePath());
+ output.shouldHaveExitValue(0);
+ output.shouldContain("Snapshot resolved");
+ output.shouldContain("-debug 2 was used");
+ output.shouldNotContain("ERROR");
- /* Make sure patterns in output look ok */
- if (run.output_contains("ERROR")) {
- throw new RuntimeException("Test failed - ERROR seen in output");
+ dumpFile.delete();
+ }
+
+ private static OutputAnalyzer jhat(String... toolArgs) throws Exception {
+ JDKToolLauncher launcher = JDKToolLauncher.createUsingTestJDK("jhat");
+ if (toolArgs != null) {
+ for (String toolArg : toolArgs) {
+ launcher.addToolArg(toolArg);
+ }
}
- /* Must be a pass. */
- System.out.println("Test passed - cleanly terminated");
+ ProcessBuilder processBuilder = new ProcessBuilder();
+ processBuilder.command(launcher.getCommand());
+ System.out.println(Arrays.toString(processBuilder.command().toArray()).replace(",", ""));
+ OutputAnalyzer output = new OutputAnalyzer(processBuilder.start());
+ System.out.println(output.getOutput());
+
+ return output;
}
+
}
--- a/jdk/test/sun/tools/jhat/HatRun.java Thu Jun 19 11:22:36 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,226 +0,0 @@
-/*
- * Copyright (c) 2005, 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.
- *
- * 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.
- */
-
-
-/*
- *
- * Support classes for running jhat tests
- *
- */
-
-import java.io.InputStream;
-import java.io.IOException;
-import java.io.File;
-import java.io.BufferedInputStream;
-import java.io.PrintStream;
-
-/*
- * Helper class to direct process output to a StringBuffer
- */
-class MyInputStream implements Runnable {
- private String name;
- private BufferedInputStream in;
- private StringBuffer buffer;
-
- /* Create MyInputStream that saves all output to a StringBuffer */
- MyInputStream(String name, InputStream in) {
- this.name = name;
- this.in = new BufferedInputStream(in);
- buffer = new StringBuffer(4096);
- Thread thr = new Thread(this);
- thr.setDaemon(true);
- thr.start();
- }
-
- /* Dump the buffer */
- void dump(PrintStream x) {
- String str = buffer.toString();
- x.println("<beginning of " + name + " buffer>");
- x.println(str);
- x.println("<end of buffer>");
- }
-
- /* Check to see if a pattern is inside the output. */
- boolean contains(String pattern) {
- String str = buffer.toString();
- return str.contains(pattern);
- }
-
- /* Runs as a separate thread capturing all output in a StringBuffer */
- public void run() {
- try {
- byte b[] = new byte[100];
- for (;;) {
- int n = in.read(b);
- String str;
- if (n < 0) {
- break;
- }
- str = new String(b, 0, n);
- buffer.append(str);
- System.out.print(str);
- }
- } catch (IOException ioe) { /* skip */ }
- }
-}
-
-/*
- * Main jhat run
- */
-public class HatRun {
-
- private String all_hprof_options;
- private String all_hat_options;
- private String dumpfile;
- private MyInputStream output;
- private MyInputStream error;
-
- /* Create a Hat run process */
- public HatRun(String hprof_options, String hat_options)
- {
- all_hprof_options = hprof_options;
- all_hat_options = hat_options;
- }
-
- /*
- * Execute a process with an -agentpath or -agentlib command option
- */
- public void runit(String class_name)
- {
- runit(class_name, null);
- }
-
- /*
- * Execute a command.
- */
- private void execute(String cmd[])
- {
- /* Begin process */
- Process p;
- String cmdLine = "";
- int i;
-
- for ( i = 0 ; i < cmd.length; i++ ) {
- cmdLine += cmd[i];
- cmdLine += " ";
- }
- System.out.println("Starting: " + cmdLine);
-
- try {
- p = Runtime.getRuntime().exec(cmd);
- } catch ( IOException e ) {
- throw new RuntimeException("Test failed - exec got IO exception");
- }
-
- /* Save process output in StringBuffers */
- output = new MyInputStream("Input Stream", p.getInputStream());
- error = new MyInputStream("Error Stream", p.getErrorStream());
-
- /* Wait for process to complete, and if exit code is non-zero we fail */
- try {
- int exitStatus;
- exitStatus = p.waitFor();
- if ( exitStatus != 0) {
- System.out.println("Exit code is " + exitStatus);
- error.dump(System.out);
- output.dump(System.out);
- throw new RuntimeException("Test failed - " +
- "exit return code non-zero " +
- "(exitStatus==" + exitStatus + ")");
- }
- } catch ( InterruptedException e ) {
- throw new RuntimeException("Test failed - process interrupted");
- }
- System.out.println("Completed: " + cmdLine);
- }
-
- /*
- * Execute a process with an -agentpath or -agentlib command option
- * plus any set of other java options.
- */
- public void runit(String class_name, String vm_options[])
- {
- String jre_home = System.getProperty("java.home");
- String sdk_home = (jre_home.endsWith("jre") ?
- (jre_home + File.separator + "..") :
- jre_home );
- String cdir = System.getProperty("test.classes", ".");
- String os_arch = System.getProperty("os.arch");
- String os_name = System.getProperty("os.name");
- String java = jre_home
- + File.separator + "bin"
- + File.separator + "java";
- String jhat = sdk_home + File.separator + "bin"
- + File.separator + "jhat";
- /* Array of strings to be passed in for exec:
- * 1. java
- * 2. -Dtest.classes=.
- * 3. -Xcheck:jni (Just because it finds bugs)
- * 4. -Xverify:all (Make sure verification is on full blast)
- * 5. -agent
- * vm_options
- * 6+i. classname
- */
- int nvm_options = 0;
- if ( vm_options != null ) nvm_options = vm_options.length;
- String cmd[] = new String[1 + 7 + nvm_options];
- int i,j;
-
- i = 0;
- cmd[i++] = java;
- cmd[i++] = "-cp";
- cmd[i++] = cdir;
- cmd[i++] = "-Dtest.classes=" + cdir;
- cmd[i++] = "-Xcheck:jni";
- cmd[i++] = "-Xverify:all";
- dumpfile= cdir + File.separator + class_name + ".hdump";
- cmd[i++] = "-agentlib:hprof=" + all_hprof_options
- + ",format=b,file=" + dumpfile;
- /* Add any special VM options */
- for ( j = 0; j < nvm_options; j++ ) {
- cmd[i++] = vm_options[j];
- }
- /* Add classname */
- cmd[i++] = class_name;
-
- /* Execute process */
- execute(cmd);
-
- /* Run jhat */
- String jhat_cmd[] = new String[4];
- jhat_cmd[0] = jhat;
- jhat_cmd[1] = "-debug";
- jhat_cmd[2] = "2";
- jhat_cmd[3] = dumpfile;
-
- /* Execute process */
- execute(jhat_cmd);
-
- }
-
- /* Does the pattern appear in the output of this process */
- public boolean output_contains(String pattern)
- {
- return output.contains(pattern) || error.contains(pattern);
- }
-}
--- a/nashorn/.hgtags Thu Jun 19 11:22:36 2014 -0700
+++ b/nashorn/.hgtags Wed Jul 05 19:46:31 2017 +0200
@@ -252,3 +252,4 @@
fed8c83dfba4dce94d2ae1cb82f026634ff2a3e4 jdk9-b16
4a47b7cfecdf2a865811ab08a7ef49c942801d7c jdk9-b17
893c337bc95fef3885baa3e4ffc30d68f62a829f jdk9-b18
+46e36a92e37c06dea50f8c829549d9d0bfed4e3c jdk9-b19
--- a/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/MemberInfo.java Thu Jun 19 11:22:36 2014 -0700
+++ b/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/MemberInfo.java Wed Jul 05 19:46:31 2017 +0200
@@ -412,6 +412,10 @@
}
}
}
+ break;
+
+ default:
+ break;
}
}
@@ -450,7 +454,7 @@
if (type.getSort() == Type.OBJECT) {
try {
- final Class clazz = Class.forName(type.getClassName(), false, myLoader);
+ final Class<?> clazz = Class.forName(type.getClassName(), false, myLoader);
return ScriptObject.class.isAssignableFrom(clazz);
} catch (final ClassNotFoundException cnfe) {
return false;
--- a/nashorn/make/project.properties Thu Jun 19 11:22:36 2014 -0700
+++ b/nashorn/make/project.properties Wed Jul 05 19:46:31 2017 +0200
@@ -283,7 +283,7 @@
-XX:+HeapDumpOnOutOfMemoryError
# turn on assertions for tests
-run.test.jvmargs.main=${run.test.jvmargs.common} -ea -Dnashorn.lazy
+run.test.jvmargs.main=${run.test.jvmargs.common} -ea
# extra jvmargs that might be useful for debugging
#
@@ -305,7 +305,7 @@
# -XX:+PrintNMethods
# Use best known performance options for octane
-run.test.jvmargs.octane.main=${run.test.jvmargs.common} -Dnashorn.lazy -XX:+UnlockDiagnosticVMOptions -XX:+UseNewCode -XX:TypeProfileLevel=222
+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
--- a/nashorn/src/jdk/nashorn/internal/codegen/Compiler.java Thu Jun 19 11:22:36 2014 -0700
+++ b/nashorn/src/jdk/nashorn/internal/codegen/Compiler.java Wed Jul 05 19:46:31 2017 +0200
@@ -47,7 +47,9 @@
import java.util.Map;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Consumer;
import java.util.logging.Level;
+
import jdk.internal.dynalink.support.NameCodec;
import jdk.nashorn.internal.codegen.ClassEmitter.Flag;
import jdk.nashorn.internal.codegen.types.Type;
@@ -421,7 +423,14 @@
@Override
public DebugLogger initLogger(final Context ctxt) {
- return ctxt.getLogger(this.getClass());
+ return ctxt.getLogger(this.getClass(), new Consumer<DebugLogger>() {
+ @Override
+ public void accept(final DebugLogger newLogger) {
+ if (!Compiler.this.getScriptEnvironment()._lazy_compilation) {
+ newLogger.warning("WARNING: Running with lazy compilation switched off. This is not a default setting.");
+ }
+ }
+ });
}
ScriptEnvironment getScriptEnvironment() {
--- a/nashorn/src/jdk/nashorn/internal/ir/BinaryNode.java Thu Jun 19 11:22:36 2014 -0700
+++ b/nashorn/src/jdk/nashorn/internal/ir/BinaryNode.java Wed Jul 05 19:46:31 2017 +0200
@@ -45,7 +45,7 @@
public final class BinaryNode extends Expression implements Assignment<Expression>, Optimistic {
// Placeholder for "undecided optimistic ADD type". Unfortunately, we can't decide the type of ADD during optimistic
// type calculation as it can have local variables as its operands that will decide its ultimate type.
- private static final Type OPTIMISTIC_UNDECIDED_TYPE = Type.typeFor(new Object(){}.getClass());
+ private static final Type OPTIMISTIC_UNDECIDED_TYPE = Type.typeFor(new Object(){/*empty*/}.getClass());
/** Left hand side argument. */
private final Expression lhs;
--- a/nashorn/src/jdk/nashorn/internal/ir/FunctionNode.java Thu Jun 19 11:22:36 2014 -0700
+++ b/nashorn/src/jdk/nashorn/internal/ir/FunctionNode.java Wed Jul 05 19:46:31 2017 +0200
@@ -99,7 +99,7 @@
BYTECODE_GENERATED,
/** method has been installed */
BYTECODE_INSTALLED
- };
+ }
/** Source of entity. */
private final Source source;
@@ -388,10 +388,11 @@
}
/**
- * static source name getter
+ * Static source name getter
+ *
* @param source
* @param sourceURL
- * @return
+ * @return source name
*/
public static String getSourceName(final Source source, final String sourceURL) {
return sourceURL != null ? sourceURL : source.getName();
--- a/nashorn/src/jdk/nashorn/internal/objects/NativeObject.java Thu Jun 19 11:22:36 2014 -0700
+++ b/nashorn/src/jdk/nashorn/internal/objects/NativeObject.java Wed Jul 05 19:46:31 2017 +0200
@@ -75,7 +75,10 @@
*/
@ScriptClass("Object")
public final class NativeObject {
+ /** Methodhandle to proto getter */
public static final MethodHandle GET__PROTO__ = findOwnMH("get__proto__", ScriptObject.class, Object.class);
+
+ /** Methodhandle to proto setter */
public static final MethodHandle SET__PROTO__ = findOwnMH("set__proto__", Object.class, Object.class, Object.class);
private static final Object TO_STRING = new Object();
--- a/nashorn/src/jdk/nashorn/internal/parser/Parser.java Thu Jun 19 11:22:36 2014 -0700
+++ b/nashorn/src/jdk/nashorn/internal/parser/Parser.java Wed Jul 05 19:46:31 2017 +0200
@@ -680,7 +680,7 @@
*/
private FunctionNode program(final String scriptName, final boolean allowPropertyFunction) {
// Make a pseudo-token for the script holding its start and length.
- final long functionToken = Token.toDesc(FUNCTION, getProgramStartPosition(token), source.getLength());
+ final long functionToken = Token.toDesc(FUNCTION, Token.descPosition(Token.withDelimiter(token)), source.getLength());
final int functionLine = line;
// Set up the script to append elements.
@@ -711,20 +711,6 @@
}
/**
- * Returns the start position of the program based on its first token. Normally returns the position of the token
- * itself, except in case of string tokens which report their position past their opening delimiter and thus need
- * to have one subtracted from their position.
- * @param firstToken the first token of the program
- * @return the start position of the program
- */
- private static int getProgramStartPosition(final long firstToken) {
- final int start = Token.descPosition(firstToken);
- switch(Token.descType(firstToken)) {
- case STRING: case ESCSTRING: case EXECSTRING: return start - 1;
- default: return start;
- }
- }
- /**
* Directive value or null if statement is not a directive.
*
* @param stmt Statement to be checked
--- a/nashorn/src/jdk/nashorn/internal/parser/Token.java Thu Jun 19 11:22:36 2014 -0700
+++ b/nashorn/src/jdk/nashorn/internal/parser/Token.java Wed Jul 05 19:46:31 2017 +0200
@@ -61,6 +61,28 @@
}
/**
+ * Normally returns the token itself, except in case of string tokens
+ * which report their position past their opening delimiter and thus
+ * need to have position and length adjusted.
+ *
+ * @param token Token descriptor.
+ * @return same or adjusted token.
+ */
+ public static long withDelimiter(final long token) {
+ final TokenType tokenType = Token.descType(token);
+ switch(tokenType) {
+ case STRING: case ESCSTRING: case EXECSTRING: {
+ final int start = Token.descPosition(token) - 1;
+ final int len = Token.descLength(token) + 2;
+ return toDesc(tokenType, start, len);
+ }
+ default: {
+ return token;
+ }
+ }
+ }
+
+ /**
* Extract token length from a token descriptor.
* @param token Token descriptor.
* @return Length of the token.
--- a/nashorn/src/jdk/nashorn/internal/runtime/Context.java Thu Jun 19 11:22:36 2014 -0700
+++ b/nashorn/src/jdk/nashorn/internal/runtime/Context.java Wed Jul 05 19:46:31 2017 +0200
@@ -1236,6 +1236,16 @@
* @return debuglogger associated with that class
*/
public DebugLogger getLogger(final Class<? extends Loggable> clazz) {
+ return getLogger(clazz, null);
+ }
+
+ /**
+ * Get a logger, given a loggable class
+ * @param clazz a Loggable class
+ * @param initHook an init hook - if this is the first time the logger is created in the context, run the init hook
+ * @return debuglogger associated with that class
+ */
+ public DebugLogger getLogger(final Class<? extends Loggable> clazz, final Consumer<DebugLogger> initHook) {
final String name = getLoggerName(clazz);
DebugLogger logger = loggers.get(name);
if (logger == null) {
@@ -1244,6 +1254,9 @@
}
final LoggerInfo info = env._loggers.get(name);
logger = new DebugLogger(name, info.getLevel(), info.isQuiet());
+ if (initHook != null) {
+ initHook.accept(logger);
+ }
loggers.put(name, logger);
}
return logger;
--- a/nashorn/src/jdk/nashorn/internal/runtime/FinalScriptFunctionData.java Thu Jun 19 11:22:36 2014 -0700
+++ b/nashorn/src/jdk/nashorn/internal/runtime/FinalScriptFunctionData.java Wed Jul 05 19:46:31 2017 +0200
@@ -34,6 +34,8 @@
*/
final class FinalScriptFunctionData extends ScriptFunctionData {
+ private static final long serialVersionUID = -930632846167768864L;
+
/**
* Constructor - used for bind
*
--- a/nashorn/src/jdk/nashorn/internal/runtime/PropertyMap.java Thu Jun 19 11:22:36 2014 -0700
+++ b/nashorn/src/jdk/nashorn/internal/runtime/PropertyMap.java Wed Jul 05 19:46:31 2017 +0200
@@ -185,6 +185,7 @@
* properties with keys that are valid array indices.</p>
*
* @param properties Collection of initial properties.
+ * @param className class name
* @param fieldCount Number of fields in use.
* @param fieldMaximum Number of fields available.
* @param spillLength Number of used spill slots.
--- a/nashorn/src/jdk/nashorn/internal/runtime/RecompilableScriptFunctionData.java Thu Jun 19 11:22:36 2014 -0700
+++ b/nashorn/src/jdk/nashorn/internal/runtime/RecompilableScriptFunctionData.java Wed Jul 05 19:46:31 2017 +0200
@@ -54,7 +54,6 @@
import jdk.nashorn.internal.runtime.logging.DebugLogger;
import jdk.nashorn.internal.runtime.logging.Loggable;
import jdk.nashorn.internal.runtime.logging.Logger;
-import jdk.nashorn.internal.runtime.options.Options;
import jdk.nashorn.internal.scripts.JS;
/**
@@ -65,9 +64,6 @@
*/
@Logger(name="recompile")
public final class RecompilableScriptFunctionData extends ScriptFunctionData implements Loggable {
- /** Is lazy compilation enabled? TODO: this should be the default */
- public static final boolean LAZY_COMPILATION = Options.getBooleanProperty("nashorn.lazy");
-
/** Prefix used for all recompiled script classes */
public static final String RECOMPILATION_PREFIX = "Recompilation$";
@@ -240,6 +236,12 @@
return "function " + (name == null ? "" : name) + "() { [native code] }";
}
+ /**
+ * Setter for code and source
+ *
+ * @param code map of code, class name to class
+ * @param source source
+ */
public void setCodeAndSource(final Map<String, Class<?>> code, final Source source) {
this.source = source;
if (methodLocator != null) {
@@ -292,7 +294,7 @@
private static long tokenFor(final FunctionNode fn) {
final int position = Token.descPosition(fn.getFirstToken());
- final long lastToken = fn.getLastToken();
+ final long lastToken = Token.withDelimiter(fn.getLastToken());
// EOL uses length field to store the line number
final int length = Token.descPosition(lastToken) - position + (Token.descType(lastToken) == TokenType.EOL ? 0 : Token.descLength(lastToken));
--- a/nashorn/src/jdk/nashorn/internal/runtime/ScriptObject.java Thu Jun 19 11:22:36 2014 -0700
+++ b/nashorn/src/jdk/nashorn/internal/runtime/ScriptObject.java Wed Jul 05 19:46:31 2017 +0200
@@ -2267,7 +2267,7 @@
if (mh != null) {
assert func != null;
- if (scopeAccess && func != null && func.isStrict()) {
+ if (scopeAccess && func.isStrict()) {
mh = bindTo(mh, UNDEFINED);
}
return new GuardedInvocation(
--- a/nashorn/src/jdk/nashorn/internal/runtime/Source.java Thu Jun 19 11:22:36 2014 -0700
+++ b/nashorn/src/jdk/nashorn/internal/runtime/Source.java Wed Jul 05 19:46:31 2017 +0200
@@ -99,12 +99,13 @@
// Force any access errors
data.checkPermissionAndClose();
return existingSource;
- } else {
- // All sources in cache must be fully loaded
- data.load();
- CACHE.put(newSource, newSource);
- return newSource;
}
+
+ // All sources in cache must be fully loaded
+ data.load();
+ CACHE.put(newSource, newSource);
+
+ return newSource;
} catch (final RuntimeException e) {
final Throwable cause = e.getCause();
if (cause instanceof IOException) {
@@ -291,7 +292,9 @@
}
protected void checkPermissionAndClose() throws IOException {
- try (InputStream in = url.openStream()) {}
+ try (InputStream in = url.openStream()) {
+ // empty
+ }
debug("permission checked for ", url);
}
@@ -366,20 +369,24 @@
}
/**
- * Returns an instance
+ * Returns a Source instance
*
* @param name source name
* @param content contents as char array
+ *
+ * @return source instance
*/
public static Source sourceFor(final String name, final char[] content) {
return new Source(name, baseName(name), new RawData(content));
}
/**
- * Returns an instance
+ * Returns a Source instance
*
* @param name source name
* @param content contents as string
+ *
+ * @return source instance
*/
public static Source sourceFor(final String name, final String content) {
return new Source(name, baseName(name), new RawData(content));
@@ -391,6 +398,8 @@
* @param name source name
* @param url url from which source can be loaded
*
+ * @return source instance
+ *
* @throws IOException if source cannot be loaded
*/
public static Source sourceFor(final String name, final URL url) throws IOException {
@@ -404,6 +413,8 @@
* @param url url from which source can be loaded
* @param cs Charset used to convert bytes to chars
*
+ * @return source instance
+ *
* @throws IOException if source cannot be loaded
*/
public static Source sourceFor(final String name, final URL url, final Charset cs) throws IOException {
@@ -416,6 +427,8 @@
* @param name source name
* @param file file from which source can be loaded
*
+ * @return source instance
+ *
* @throws IOException if source cannot be loaded
*/
public static Source sourceFor(final String name, final File file) throws IOException {
@@ -429,6 +442,8 @@
* @param file file from which source can be loaded
* @param cs Charset used to convert bytes to chars
*
+ * @return source instance
+ *
* @throws IOException if source cannot be loaded
*/
public static Source sourceFor(final String name, final File file, final Charset cs) throws IOException {
@@ -441,6 +456,9 @@
*
* @param name source name
* @param reader reader from which source can be loaded
+ *
+ * @return source instance
+ *
* @throws IOException if source cannot be loaded
*/
public static Source sourceFor(final String name, final Reader reader) throws IOException {
@@ -542,9 +560,9 @@
* @return Index of first character of line.
*/
private int findBOLN(final int position) {
- final char[] data = data();
+ final char[] d = data();
for (int i = position - 1; i > 0; i--) {
- final char ch = data[i];
+ final char ch = d[i];
if (ch == '\n' || ch == '\r') {
return i + 1;
@@ -560,10 +578,10 @@
* @return Index of last character of line.
*/
private int findEOLN(final int position) {
- final char[] data = data();
- final int length = data.length;
+ final char[] d = data();
+ final int length = d.length;
for (int i = position; i < length; i++) {
- final char ch = data[i];
+ final char ch = d[i];
if (ch == '\n' || ch == '\r') {
return i - 1;
@@ -583,12 +601,12 @@
* @return Line number.
*/
public int getLine(final int position) {
- final char[] data = data();
+ final char[] d = data();
// Line count starts at 1.
int line = 1;
for (int i = 0; i < position; i++) {
- final char ch = data[i];
+ final char ch = d[i];
// Works for both \n and \r\n.
if (ch == '\n') {
line++;
--- a/nashorn/src/jdk/nashorn/internal/runtime/arrays/ArrayFilter.java Thu Jun 19 11:22:36 2014 -0700
+++ b/nashorn/src/jdk/nashorn/internal/runtime/arrays/ArrayFilter.java Wed Jul 05 19:46:31 2017 +0200
@@ -141,21 +141,6 @@
return this;
}
- private static void printTrace(final Throwable t, final String msg) {
- final java.io.StringWriter sw = new java.io.StringWriter();
- final java.io.PrintWriter pw = new java.io.PrintWriter(sw, false);
- pw.println(msg);
- final StackTraceElement[] trace = t.getStackTrace();
- for(final StackTraceElement e: trace) {
- pw.println(" at " + e);
- if(e.getClassName().startsWith("jdk.nashorn.")) {
- break;
- }
- }
- pw.flush();
- System.out.println(sw.toString());
- }
-
@Override
public Type getOptimisticType() {
return underlying.getOptimisticType();
--- a/nashorn/src/jdk/nashorn/internal/runtime/logging/DebugLogger.java Thu Jun 19 11:22:36 2014 -0700
+++ b/nashorn/src/jdk/nashorn/internal/runtime/logging/DebugLogger.java Wed Jul 05 19:46:31 2017 +0200
@@ -540,7 +540,7 @@
/**
* Shorthand for outputting a log string as log level
- * {@link java.util.logging.Level#FINE} on this logger
+ * {@link java.util.logging.Level#SEVERE} on this logger
* @param objs object array to log - use this to perform lazy concatenation to avoid unconditional toString overhead
*/
public void severe(final Object... objs) {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8047035.js Wed Jul 05 19:46:31 2017 +0200
@@ -0,0 +1,37 @@
+/*
+ * 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.
+ */
+
+/**
+ * JDK-8047035: (function() "hello")() crashes in Lexer with jdk9
+ *
+ * @test
+ * @run
+ */
+
+// should not print ")" at the end
+print(function() "hello");
+print(function() '');
+
+// The following should not crash inside lexer
+print((function() '')());
+print((function() "hello")());
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8047035.js.EXPECTED Wed Jul 05 19:46:31 2017 +0200
@@ -0,0 +1,4 @@
+function() "hello"
+function() ''
+
+hello
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8047057.js Wed Jul 05 19:46:31 2017 +0200
@@ -0,0 +1,75 @@
+/*
+ * 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.
+ */
+
+/**
+ * JDK-8047057: Add a regression test for the passing test cases from JDK-8042304
+ *
+ * @test
+ * @run
+ */
+
+// commented out makeFuncAndCall calls are still result in crash
+// Tests commented with //** fail only within test framework.
+// Pass fine with standalone "jjs" mode.
+
+function makeFuncAndCall(code) {
+ Function(code)();
+}
+
+function makeFuncExpectError(code, ErrorType) {
+ try {
+ makeFuncAndCall(code);
+ } catch (e) {
+ if (! (e instanceof ErrorType)) {
+ fail(ErrorType.name + " expected, got " + e);
+ }
+ }
+}
+
+// makeFuncAndCall("switch(0) { default: {break;} return }");
+// makeFuncAndCall("L: { { break L; } return; }");
+makeFuncAndCall("L: { while(0) break L; return; }");
+makeFuncExpectError("L: {while(0) break L; return [](); }", TypeError);
+// makeFuncAndCall("do with({}) break ; while(0);");
+makeFuncAndCall("while(0) with({}) continue ;");
+//** makeFuncAndCall("eval([]);");
+//** makeFuncAndCall("try{} finally{[]}");
+makeFuncAndCall("try { } catch(x if 1) { try { } catch(x2) { } }");
+makeFuncAndCall("try { } catch(x if 1) { try { return; } catch(x2) { { } } }");
+makeFuncAndCall("Error() * (false)[-0]--");
+makeFuncAndCall("try { var x = 1, x = null; } finally { }");
+makeFuncAndCall("try { var x = {}, x = []; } catch(x3) { }");
+//** makeFuncAndCall("[delete this]");
+// makeFuncAndCall("if(eval('', eval('', function() {}))) { }");
+// makeFuncAndCall("if(eval('', eval('', function() {}))) { }");
+// makeFuncAndCall("eval(\"[,,];\", [11,12,13,14].some)");
+// makeFuncAndCall("eval(\"1.2e3\", ({})[ /x/ ])");
+// makeFuncAndCall("eval(\"x4\", x3);");
+makeFuncAndCall("with({5.0000000000000000000000: String()}){(false); }");
+makeFuncAndCall("try { var x = undefined, x = 5.0000000000000000000000; } catch(x) { x = undefined; }");
+makeFuncAndCall("(function (x){ x %= this}(false))");
+// makeFuncAndCall("eval.apply.apply(function(){ eval('') })");
+makeFuncAndCall("(false % !this) && 0");
+makeFuncAndCall("with({8: 'fafafa'.replace()}){ }");
+makeFuncAndCall("(function (x) '' )(true)");
+makeFuncExpectError("new eval(function(){})", TypeError);
--- a/nashorn/test/src/UnnamedPackageTestCallback.java Thu Jun 19 11:22:36 2014 -0700
+++ b/nashorn/test/src/UnnamedPackageTestCallback.java Wed Jul 05 19:46:31 2017 +0200
@@ -23,6 +23,14 @@
* questions.
*/
+/**
+ * Interface for callbacks used by the test suite.
+ */
public interface UnnamedPackageTestCallback {
+ /**
+ * Call function
+ * @param s string argument
+ * @return string
+ */
String call(String s);
}